用户填写一些表格,在其中设置报告生成的参数。他提交表单,服务器验证参数,向用户返回一切正常的消息并生成报告。报告生成完成后,用户会收到带有报告链接的电子邮件。
在 grails 中实现这一目标的正确方法是什么?
目前我有一个生成报告的服务,它看起来像这样:
@Transactional
class AnalyticsService {
ExecutorService executor = Executors.newSingleThreadExecutor()
def buildExportAndSendMail() {
executor.execute {
//GENERATE REPORT AND SEND MAIL. USES GORM.
}
}
@PreDestroy
void shutdown() {
executor.shutdownNow()
}
}
我的 Controller 操作如下所示:
def generateReport(ReportParams command) {
if(!command.hasErrors()) {
analyticsService.buildExportAndSendMail()
render([success:true, html:"Your report is being generated."] as JSON)
} else {
...
}
}
但是,服务在尝试访问域对象字段时会引发错误:
Exception in thread "pool-8-thread-1"
Error |
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
在 grails 中执行此操作的正确方法是什么?
最佳答案
这里的问题是您正在创建一个新线程并且它没有绑定(bind)到 Hibernate session 。创建一个很容易。您使用什么域类并不重要。例如:
def buildExportAndSendMail() {
executor.execute {
SomeDomainClass.withNewSession { session ->
//GENERATE REPORT AND SEND MAIL. USES GORM.
}
}
}
您可以阅读有关
withNewSession
的更多信息在 documentation .
关于hibernate - Grails 和后台任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25835754/