我在Spring Async带注释的服务方法中持久化Grails域对象时遇到问题。
以下是简化代码:
class DocumentService {
@Async
def process(Long documentId, Organization organization) {
...
def organizationCari = new OrganizationCari(organization: organization, active: true)
organizationCari.save(flush: true, failOnError: true)
print "Document processing..."
...
print "Document processed..."
}
}
我让方法异步运行,但是我似乎无法在控制台上打印任何内容,因为线程在保存操作时结束。我没有错误,域对象仍然没有持久化。
删除异步注释可以解决问题,但我必须异步运行该方法。
我在Spring 3.1.2中使用Grails 2.1.1。
答案 0 :(得分:4)
问题是新的异步线程中没有hibernate会话,默认的AsyncTaskExecutor
没有记录异常。
您可以通过在try/catch
方法中放置@Async
块并自行记录异常来自行验证。
解决方案是在服务方法中围绕GORM代码使用Domain.withNewSession
:
import org.springframework.scheduling.annotation.Async
class MyService {
@Async
void myAsyncMethod() {
MyDomain.withNewSession {
MyDomain m = new MyDomain(...)
m.save()
}
}
}
如果您有许多异步方法,可以考虑在this SO answer中创建自己的AsyncTaskExecutor
。