5

JavaEEで以下を実装することをどのように提案しますか:

  1. 「何か」を常に監視し、いくつかの条件が適用される場合は、データベースで操作を行うアプリ サーバー (ステートフル セッション Bean を考えていました) にバックグラウンド プロセスが必要です。

  2. 最も重要なことは、さまざまなクライアントによってリモートで操作する必要があることです。

したがって、基本的には、常に実行され、その状態を維持し、多数のリモート クライアントによるメソッド呼び出しに対して開かれているプロセスが必要です。

私はJavaEEが初めてなので、どのアプローチ/「テクノロジー」を使用するか少し混乱しています。助けていただければ幸いです。

4

4 に答える 4

7

ステートレス セッションまたはシングルトン Bean と EJB タイマーおよびタイマー サービスを組み合わせて使用​​できます。Bean は、リモート クライアントがバックグラウンド プロセスを制御するために使用するインターフェイスになります。タイマー サービスは、Bean のメソッドを定期的にコールバックして、状態を確認します。タイマーは EJB コンテナーによって自動的に永続化されるため、Bean クライアントが切断されたときにその役割を果たします。

ここにスケッチがあります:

@Singleton
...
public TimerMangerbean implements TimerManager {

   @Resource
   private TimerService timerService;

   public void startMonitoring() {
      //start in 5 sec and timeout every 10 minutes
      Timer timer = timerService.createTimer(5000, 60000, "MyTimer");
   }

   public void stopMonitoring() {
      Collection<Timer> timers = timerService.getTimers();
      for(Timer timer : timers) {
         //look for your timer
         if("MyTimer".equals(timer.getInfo())) {
            timer.cancel();break;
         }
      }
   }

   //called every 10 minutes
   @Timeout
   public void onTimeout() {
      //verify the condition and do your processing
   }
}

関連項目: Oracle JavaEE チュートリアルでのタイマー サービスの使用

于 2013-04-07T08:46:04.550 に答える
1

あなたが述べたように、2 つの要件があります。1) 定期的にバックグラウンド ジョブを実行すること、および 2) クライアントの要求に応答することです。

1) の場合、 を使用するTimerServiceか、 でスレッドを生成できますServletContextListener。2 つ目は完全には適合していませんが、機能します。タイマーを使用する場合は、定期的なタイマー (@dcernahoschi が指摘) を作成するか、それ自体を再スケジュールする一意のタイマーを作成できます。

@Timeout
public void onTimeout() {
     //do something
     // create a new timer
 }

定期的なタイマーが 10 秒ごとに作動し、10 秒を超えて処理を継続している場合は、問題が発生している可能性があります。処理時間が固定されていない場合は、それ自体を再スケジュールするタイマーを使用する方が効果的です。

2) については、ステートレスまたはステイフル EJB を使用できます。それがまさにその目的です。

于 2013-04-07T11:28:18.453 に答える