2009-07-26 19 views
7

私は、実行時間が〜5分(おそらくそれ以上)の計算的に集中した最適化を持つGrailsアプリケーションを持っています。現在、メインのリクエストスレッドでこれらの処理を行っています。つまり、リクエストが返されるまでに5分かかります。それはうまくいきますが、使いやすさの観点からは恐ろしいです。Grailsアプリケーションで長期実行ジョブのキューを構築する最も良い方法は何ですか?

これを非同期の方法で実装する最良の方法は何ですか?私はThreadPoolExecutorが関与しなければならないと仮定しますが、どうやって起動してアクセスするのですか? Grailsサービスとしてモデル化できますか?または仕事(それらは繰り返し仕事のためだけに意味があるようです)?

また、ジョブステータスを処理するにはどうすればよいですか。 DBの新しいクラスやフラグを使用していますか?ブラウザにスピナーが表示され、状態が変わるまでポーリングを続けますか?

答えて

3

grailsプラグインbackground-threadがあります。あなたが探しているものだけかもしれません。

もちろん、独自のスレッドプールをロールしたり、既存のJavaを使用することは可能です。

3

私はグレーズJMS Pluginを使っています。

その後、あなたは基礎となるJMSプロバイダ(のようOpenMQまたはActiveMQと自動的に相互作用「のonMessage」の方法でサービスを作成することができます。

をそれはこの種のものはかなり容易になります。

+0

単にThreadPoolExecutorを使用するのに比べて、どんな利点がありますか?それよりもはるかに複雑に聞こえる。 –

+0

それは間違いなくより複雑です。主なメリットは、あなたの質問がいくつかの要件を暗示している監視機能とポーリング機能の一部にあります。このような種類のものはJMSの世界では解決されていますが、その周りにはより多くのセットアップ/メンテナンスがあります。 本当に "enterprisey"の要件に依存します。モニタリングについて気にしない場合や、処理中にコンテナがダウンした場合に何が起きるのかを簡単に確認してください。ただ1つの可能性のあるオプション。 –

+1

ああ、そうです。私が必要とする唯一の監視は、特定の仕事が完了するのを待っているユーザーのためです。私はトランザクションの安全性の必要もないので、より簡単なアプローチをとるつもりです。 –

2

精神で私は単純なサービスとしてこのようなことをしています(もちろん単純すぎるかもしれませんが、批判は歓迎されます)。

私はGroovyの機能にThreadが静的開始メソッドを持っているクロージャをとる。を参照してください。

私はのように見えたサービスのメソッド実装:

synchronized def runThreadedTask() { 
    if(taskRunning) { 
    // taskRunning is defined as a service level flag to monitor job status 
    // if we are already running the task just return 
    return; 
    } 

    Thread.start { 
    taskRunning = true 
    // do job processing here 
    taskRunning = false 
    } 
} 
1

Grailsのインストール・プラグイン、バックグラウンドスレッド

デフbackgroundService

backgroundService.execute( "私のことをやって" を、 {

//ここで動作させる

});

3

バックグラウンドスレッドのプラグインが古くなっているので、私はそれを使用することをお勧めしません。また、JMSはバックグラウンド処理のために余計に使用されているようです。 JMSは、バックグラウンド処理ユーティリティではなくメッセージキューです。

Quartzプラグインを使用するか、gparを使用することをお勧めします。

1

これが尋ねられて以来、しばらくしていましたが、検索ではじまったので、ThreadオブジェクトにGroovyスレッドクロージャが追加されていると思いました。あなたはちょうど:

 
Thread.start { 
    // async code goes here 
} 

を使用し、それを1日と呼んでください。非同期コードでは、更新データメソッドなどを呼び出すことができます。複数のスレッドを実行できる場合は、同期することができます。

関連する問題