0

EJB私は4秒を呼び出す「クライアント」を持っており、Asynchronous EJB実行するのに5秒すべてを与える必要があります。5 秒後、「クライアント」EJB は、Future実行を終了したオブジェクトから準備完了の結果を収集し、出力を返します。

クライアント部分の「待機」に問題があります。タイムアウト後にfuture.get(5, TimeUnit.MILLISECONDS) async が実行されることがあるようEJBです。それを行う正しい方法はありますか?

Future1)でオブジェクトを収集しMapます。

    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;

Future2)次に、オブジェクトからタイムアウトで出力を取得します

    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;
}

ありがとうございました

4

1 に答える 1

0

非同期コードをまだスケジュールする必要があるのか​​、それとも5秒間実行されているのか、クライアントが詳細を認識している必要はないと思います。

クライアントが気にする必要があるのは、合計待機時間だけです。無制限のリソースを持つシステムはないため、非同期コードがすぐに実行を開始するという保証はありません。

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

ps

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

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

于 2012-01-12T15:27:37.997 に答える