2010-11-23 23 views
3

私は、Webサービスからデータを取得するための作業を行ってきましたが、今は要求のスケジューリングの問題があり、どこから始めたらいいかわかりません。タスクスケジューリングはどのように実装されていますか?

私はイベントのためにjmsキューを待ち受けています。イベントを受信すると、期間の経過後にWebサービスにリクエストを行う必要があります。期間は、イベントの属性によって異なります。 Webサービスがfalseを返す場合は、trueを返すまで要求をスケジュールする必要があります。

私は、イベントまたは偽の応答の受信時にキューにルックアップ要求を作成することを考えていましたが、これは理想的ではありません - 私は常にメッセージを消費して、まだ行われていない場合はキューに戻す必要があります。

誰かがこのような問題を実装する方法についてアドバイスをいただければ、本当に感謝しています。あなたはいつもあなたが所有ロールバックすることができますhttp://java-source.net/open-source/job-scheduler

が、私はそれをお勧めしていないと思います。

答えて

0

それは時間と間隔で両方の瞬間に基づいプール、スケジューリングを提供し、より多くのカスタマイズが必要な場合には、cronのオプションがあります。私はQuartzで達成できる深みについては掘り下げませんでしたが、それと統合することもできます。

2

は、既存のOSSスケジューラを使用してください。

スケジューラの重要な機能の1つは、再起動/クラッシュを乗り越えなければならないことです。

5

まず、実行する必要がある順序でイベントをキューに保持してください。これにより、キューの先頭を見て、次のイベントのスケジュールを確認するだけで済みます。これにはPriorityQueueを使用できます。

イベントを処理するスレッドは、このキューからアイテムをポーリングして処理します。ヘッドアイテムを覗いて、次のイベントをいつ実行する必要があるかを確認します。ロッキングオブジェクトとして使用するオブジェクトを選択し、そのオブジェクトにメインスレッドのObject.wait(long)を呼び出し、メソッドに次のイベントを実行するまでのミリ秒数を渡します。

新しいスレッドが入った場合は、適切な場所のキューに追加します。アイテムがキューの先頭にある場合は、スレッドが早く起きる必要があることを意味します。 lockオブジェクトのObject.notifyAll()を呼び出して、処理スレッドを起動します。適切な時間の間、処理して眠ることは何もないことがわかります。

 
public class ProcessingQueue extends Thread { 

    private PriorityQueue<Task> tasks; 

    private volatile boolean isRunning = true; 

    public void addTask(Task t) { 
    synchronized (this.tasks) { 
     this.tasks.offer(t); 
     // this call requires synchronization to this.tasks 
     this.tasks.notifyAll(); 
    } 
    } 

    public void shutdown() { 
    this.isRunning = false; 
    synchronized (this.tasks) { 
     this.notifyAll(); 
    } 
    } 

    public void run() { 
    while (this.isRunning) { 
     synchronized (this.tasks) { 
     Task t = this.tasks.peek(); 
     // by default, if there are no tasks, this will wake every 60 seconds 
     long millisToSleep = 60000; 
     // getExecuteMillis() should return the time, in milliseconds, for execution 
     if (t != null) millisToSleep = t.getExecuteMillis() - System.currentTimeMillis(); 
     if (millisToSleep > 0) { 
      try { 
      // this line requires synchronization to this.tasks 
      // and the lock is removed while it waits 
      this.tasks.wait(millisToSleep); 
      } catch (InterruptedException e) { 
      } 
     } 
     t = this.tasks.poll(); 
     if (t != null) { 
      t.execute(); 
     } 
     } 
    } 
    } 
} 
+0

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/DelayQueue.html Java遅延キューを参照してください。時間ベースのタスクキューには非常に適しています。ここにソースコードがありますhttp://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/util/concurrent/DelayQueue.java#DelayQueue.take%28%29 – Anshul

4

私は3-Dパーティライブラリを使用することに同意します。私は石英フレームワークを使っています。バージョン3で導入されてきた私は​​で行くことに決めました http://www.quartz-scheduler.org/

関連する問題