2

SpringAsyncの注釈付きサービスメソッドで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..."


}

}

メソッドを非同期で実行していますが、保存操作でスレッドが終了するため、コンソールに何も出力されないようです。エラーは発生しませんが、ドメインオブジェクトはまだ保持されていません。

非同期アノテーションを削除すると問題は解決しますが、メソッドを非同期で実行する必要があります。

Spring3.1.2でGrails2.1.1を使用しています。

4

1 に答える 1

4

問題は、新しい非同期スレッドに休止状態のセッションがなく、デフォルト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回答のように独自のメソッドを作成することを検討してください。

于 2013-03-21T15:17:44.907 に答える