2011-01-24 14 views
1

私は、org.springframework.scheduling.quartz.SimpleTriggerBeanを使用するSpringアプリケーションを使用して、メソッドの実行を定期的にスケジュールします。Spring、バックグラウンド実行またはオンデマンド

場合によっては、同じ方法を「オンデマンド」と呼びたいことがあります。これは、GUI上のアクションによって引き起こされます。私が実行したいメソッドは数秒かかるので、実行が終了するまでユーザーGUIをブロックしたくありません。さらに、「オンデマンド」実行をバックグラウンドスレッド(相互に排他的)で調整したい。

  1. は豆が が タスクをスケジュールするのTaskExecutorを使用することManagerと呼ばれる作成します。

    は、ここに1つのアプローチです。マネージャーはどちら 背景方法 Manager.scheduleTask()

  2. を持っており、「オンデマンド」 スレッドがマネージャー(Manager.scheduleTask)
  3. に同じメソッドを呼び出しますタスクが同期で実行さ メソッドを実行して、 のタスクが1つしか実行されていないことを確認します。

私はもっと巧妙な/よりクリーンなソリューションを探しています。

+0

あなたはクォーツに取り付けられていますか、それとももっと簡単なものを考えていますか? – skaffman

+0

私は石英についていません。 Springとの統合が容易なので、私はそれを使用しています。石英を使わずにアイデアはありますか? –

答えて

1

SingleThreadExecutorを使用できます。

ExecutorService exec = Executors.newSingleThreadExecutor(); 
exec.submit(<task>); 

あなたのクォーツのジョブが起動すると、エグゼキュータにタスクを送信できます。同様に、ジョブを手動で実行すると、実行者にタスクをサブミットすることもできます。 ExecutorServiceは単一のスレッドしか持たないため、タスクは一度に1回しか実行できません。タスクのもう1つのインスタンスは、現在実行中のタスクが完了するまでキューに入れられます。この場合、手動同期について心配する必要はありません。

+0

これは、同期の問題を解決します。しかし、私が提案したソリューションとほぼ同じです。私は他の可能性のあるより良いアプローチがあるかどうか疑問に思っています。 –

3

Spring 3.0を使用している場合は、参考文書のTask Execution and Schedulingセクションをご覧ください。

これは、2つの注釈が存在することを示す:soultion少なくとも同じになる

  • @Scheduled
  • @Timer

:3つの方法を有する:

private void doIt() {...} 

@Scheduled(cron="0 0 0 * * MON-FRI") 
public void doItEveryDay() {doIt();} 

@Async 
public void doItOnDemand() {doIt();} 

をだがこの注釈を使用すると、簡単に読むことができますなぜ3つの方法があるのか​​を理解する。

+0

Tksの提案。それでも同じ解決策はありますが、私は注釈で読みやすくすることに同意します。 –

関連する問題