2011-12-29 12 views
0

My Grails 1.3.7アプリは大きなXMLファイルを処理する必要があるため、大きなファイルをアップロードするコントローラを用意して、サーバー上のこのファイルのパスを処理を行うバックグラウンドスレッドに与えます私はすぐにコントローラのアクションから戻ることができます。Grailsのバックグラウンドスレッドへの参照を保持する?

今のところ、Grails Executorプラグインを使用していますが、正常に動作します。処理が進むにつれて更新されるアップロードドメインオブジェクト(現在のステータス、処理された要素の数など)があります。

  • アプリケーションがクラッシュまたはサーバーがシャットダウンしているとき、私は、ユーザーがしたいことをインターセプトし、プロセスが
  • を中断されたと言うことは、私のアップロードドメインを更新したいと思います。しかし、今、私は2より多くの要件がありますリンクをクリックしたときに処理自体を中断し、コントローラのアクションから再開する可能性があります。

バックグラウンドタスクへの参照を保持し、java.util.concurrentフレームワークによる中断を傍受する方法はありますかExecutorプラグインで使用されています)?

私はutil.concurrentでそれを行うことができない場合は、他のプラグイン/フレームワークで可能ですか?私はQuartzを見てきましたが、どうやって行うのか分かりません。

答えて

2

私はそれを完全にテストすることなく答えたくありませんが、grails-executor plugin docscallAsyncメソッドがjava.util.concurrent.Future objectを返すと述べています。プロセスが完了したか、キャンセルされた場合

  1. 決定:

    このオブジェクトは2つのことを行うために使用することができます。

  2. 実行中のプロセスをキャンセルします(必要に応じて中断しても)。

理論上、この未来をどこかのユーザーのセッションに保存できるはずです。その後、それを後で検索し、それを使用してステータスを確認したり、必要に応じてプロセスをキャンセルしたりすることができます。以下のような

何か:

session.backgroundProcess = callAsync{...} 

// later 
def bgProc = session.backgroundProcess 
if(bgProc && !(bgProc.done || bgProc.cancelled)) { 
    // process is still running 
} 

だけでしょう、それがテストされていません。また、メモリリークの原因となる問題があるかどうかもわかりません。プロセスが完了したら、Futureを切り離したことを確認する必要があります。

関連する問題