7

私はGrailsアプリを持っており、実行時間は最大5分(おそらくそれ以上)で、計算量の多い最適化が行われています。現在、メインのリクエストスレッドでこれらを行っています。つまり、リクエストが戻るまでに5分かかります。それは機能しますが、もちろん使いやすさの観点からは恐ろしいものです。

では、これを非同期的に実装するための最良の方法は何でしょうか?ThreadPoolExecutorが関与する必要があると思いますが、どのように開始してアクセスするのですか?Grailsサービスとしてモデル化できますか?またはジョブ(ただし、これらは定期的なジョブのみを対象としているようです)?

また、仕事のステータスを処理するための最良の方法は何ですか?フラグを介して、またはおそらくDB内のまったく新しいクラスを介して?ブラウザにスピナーを表示し、ステータスが変わるまでポーリングを続けますか?

4

6 に答える 6

3

これにはgrailsのJMSプラグインを使用します。

次に、基盤となるjmsプロバイダー( OpenMQActiveMQなど)と自動的に対話する「onMessage」メソッドを使用してサービスを作成できます。

それはこの種のことをかなり簡単にします。

于 2009-07-26T16:05:13.423 に答える
3

バックグラウンド スレッド プラグインは古くなっているため、使用はお勧めしません。また、JMS はバックグラウンド処理にはやり過ぎのようです。JMS は、バックグラウンド処理ユーティリティというよりはむしろメッセージ キューです。

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

于 2011-09-05T02:25:30.230 に答える
3

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

もちろん、独自のスレッド プーリングを展開したり、既存の Java を使用したりすることも可能です。

于 2009-07-26T12:39:15.690 に答える
2

「おそらく機能する最も単純なこと」の精神で、私はこのようなことを単純なサービスとして行いました。(もちろん単純すぎるかもしれませんが、批判は大歓迎です)。

Thread にはクロージャを取る静的な start メソッドがあるという Groovy の機能を使用しました。http://groovy.codehaus.org/groovy-jdk/java/lang/Thread.htmlを参照してください。

次のようなサービスにメソッドを実装しました。

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
  }
}
于 2009-08-03T17:31:18.023 に答える
1

grails インストール プラグイン バックグラウンド スレッド

def backgroundService

backgroundService.execute("私のことをしています", {

// ここで作業を行います

});

于 2009-08-20T19:43:22.727 に答える
1

これが尋ねられてからしばらく経ちましたが、検索で出てきたばかりなので、 Thread オブジェクトに Groovy スレッドクロージャーがあることを追加したいと思いました。あなたはただ使う:

スレッド開始 {
    // 非同期コードがここに入る
}

そしてそれを一日と呼びます。非同期コードは、完了時に更新データ メソッドなどを呼び出すことができます。複数のスレッドを実行できる場合は、それを同期することをお勧めします。

于 2012-11-15T18:00:34.467 に答える