2012-01-12 6 views
0

私は "EJB"を呼び出し、4 AsynchronousEJBを呼び出し、5秒間実行する必要があります。 5秒後、 "クライアント" EJBは実行を終了したFutureオブジェクトから準備完了の結果を収集し、出力を返します。非同期EJBのために最大X秒待っています

私はクライアント側で「待機中」に問題があります。私は起動しようとしましたfuture.get(5, TimeUnit.MILLISECONDS) 時々asyncと思われるEJB s タイムアウト後に実行を開始します。 正しい方法がありますか?

1)MapFutureオブジェクトを収集します。

Map<String, Future> futureMap = new HashMap<String, Future>(); 
    for (String userID: users) { 
      Future<Set<FrontPageData>> test = util.asyncGetData(userID); 
      futureMap.put(serviceID, test); 

    } 
    return futureMap; 

2)その後、私はFutureオブジェクト

final long now = Calendar.getInstance().getTimeInMillis(); 
    final long end = now + TimeUnit.SECONDS.toMillis(5) 
    Map<String, Object> output = new HashMap<String, Object>(); 
    Object data; 
    for (String userID: futureMap.keySet()) { 
     Future future= futureMap.get(userID); 
     try { 
      //check how much time left till the end 
      long timeout = end - Calendar.getInstance().getTimeInMillis(); 
      data = future.get(timeout, TimeUnit.MILLISECONDS); 
      output.put(userID, data); 
     } catch (Exception e) {//write to logs 
     } 
    } 
    return output; 
} 

からタイムアウトで出力を得る私はあなたのクライアントを考えていないあなたに

答えて

0

に感謝非同期コードをまだスケジュールする必要があるかどうか、または5秒間実行しているかどうかの詳細を認識する必要があります。

あなたのクライアントはすべて待ち時間を気にする必要があります。無制限のリソースを持つシステムはないため、非同期コードがすぐに実行される保証はありません。

実際の実行時間を5秒に制限したい場合、現実的な方法は、コードを実行するBeanでこれを行うことです。

p.s.

あなたの質問には関係ありませんが、この奇妙な計算はなぜタイムアウトになるのですか?今すぐ "今+ 5秒 - 今"を実行します。これは5秒です。

マップを反復処理し、値とキーの両方が必要な場合は、キーセットの代わりにentrySetを反復処理し、各キーにget()を実行することができます。

+0

私のクライアントは長い実行を待つことを望んでいません。つまり、実行を開始しなかったサービスを待つべきではありません。 – lili

+0

future.get(timeout)を呼び出し、タイムアウトの一部を待ちます。次回はタイムアウトを計算すると時間が少なくなります(実行するまでにどれくらいの時間が残っているか確認してください) – lili

+0

>実行にどれだけの時間が残っているか確認してください - あなたは正しいです、愚かな私 –

関連する問題