1

QuartzとServiceクラス内でのスレッドの実行について質問があります。

以前の質問に答えてもらいました:Grailsのバックグラウンドプロセスですが、別の問題があります。

セットアップ:サービスを実行するようにセットアップされたジョブがあり、完全に機能します。ただし、Serviceクラス内には、並行して実行できるアルゴリズムがあります。

問題:通常、次の非常に簡単な方法で並列実行するようにコードを設定します。

Item.each {
   Thread.start {
      do some calculations here    
      write to DB
   }
}

ただし、コードをDBに書き込む必要があり、ドメインクラスを活用する必要があるため、その時点でコードが機能しなくなります。Hibernateは、スレッドが何かにアクセスできないと不平を言います。

Serviceクラス内でスレッドを使用できず、ドメインクラスを活用できない理由がわかりません。誰かがこのジレンマを手伝ってくれる?特別な方法でスレッドを作成する必要がありますか?Serviceクラスでスレッドを作成するべきではないかもしれません(Serviceクラスはスレッド内で実行されているように見えるため)?コードをJobクラスに移動する必要がありますか?

助けてください。

ありがとうございました。

4

1 に答える 1

1

新しいスレッドには、デフォルトでHibernateセッションがバインドされていません。Hibernateセッションをアタッチするには、次のことを試してください。

Item.each {
    Thread.start {
        Item.withTransaction {
            do some calculations here    
            write to DB
        }
    }
}

また、使いやすい並列化フレームワークについてGParsを調べることもできます。

于 2012-09-10T14:19:11.943 に答える