2

我在 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..."


}

}

我有异步运行的方法,但是我似乎无法在控制台上打印任何内容,因为线程在保存操作时结束。我没有收到任何错误,并且域对象仍然没有持久化。

删除 Async 注释可以解决问题,但我必须异步运行该方法。

我将 Grails 2.1.1 与 Spring 3.1.2 一起使用。

4

1 回答 1

4

问题是新建的异步线程中没有hibernate session,默认AsyncTaskExecutor是不记录异常的。

您可以通过try/catch在您的方法中放置一个块@Async并自己记录异常来自己验证这一点。

解决方案是Domain.withNewSession在您的服务方法中使用 GORM 代码:

import org.springframework.scheduling.annotation.Async

class MyService {

    @Async
    void myAsyncMethod() {
        MyDomain.withNewSession {
            MyDomain m = new MyDomain(...)
            m.save()
        }
    }
}

如果您有许多异步方法,您可以考虑创建自己的方法,AsyncTaskExecutor如在这个 SO answer中。

于 2013-03-21T15:17:44.907 回答