Похоже, что возникла проблема с отложенной загрузкой владельцев контактов моего клиента в шаблоне. Вместо того, чтобы ожидать загрузки владельцев (неэффективно), в то время как SimpleTemplateEngine создает тело электронной почты, я с нетерпением ожидаю получения владельцев перед привязкой / созданием тела.
Мой код выше теперь выглядит так:
def emailTemplateFile = null
def ccIdToEmailMap = [:]
emailTemplateFile = Utilities.retrieveFile("email${File.separator}emailTemplate.gtpl")
def engine = new SimpleTemplateEngine()
def template = engine.createTemplate(emailTemplateFile)
for(ClientContact cc in clientContactList)
{
//there was a locking problem when we tried to create the template for too many client contacts
//i believe it was caused by lazy-fetching of the person/owners. So, I fetch them before we bind
//and make the email body.
def criteria = ClientContact.createCriteria()
cc = criteria.get {
eq("id", cc.id)
fetchMode('relationship', FM.EAGER)
fetchMode('relationship.person', FM.EAGER)
}
def binding = [clientContact : cc]
def body = template.make(binding).toString()
def email = [text: body, to: cc.emailAddress]
ccIdToEmailMap.put(cc.id, email)
}
return ccIdToEmailMap
Все еще неэффективно делать так много запросов для каждого из клиентских контактов, но ЭТО РАБОТАЕТ. Я не могу объяснить, почему ленивая загрузка их во время создания шаблона привела к зависанию grails / groovy, но это произошло. Если кто-нибудь может это объяснить, я был бы признателен.
Спасибо за ваши ответы. Зигфрид ... ты заставил меня начать в правильном направлении.
Andrew