Spring中的Grails持久性“异步”注释方法无法正常工作

时间:2013-03-21 14:07:15

标签: spring grails service asynchronous

我在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。

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