4

1.4 であるため、TimeOutException をトラップするために Executor と Future を使用できません。メソッドが完了していない場合は、30 秒後にタイムアウトする必要があります。

//Caller class
public static void main() {

EJBMethod() // has to timeout after 30 seconds

}

//EJB method in some other class
public void EJBMethod() {

}

私が考えているアプローチは、このメソッド呼び出しを Runnable でラップし、メソッドが終了した後に run() からいくつかの揮発性ブール値を設定することです。次に、呼び出し元で、そのメソッドを呼び出した後 30 秒間スリープできます。一度目が覚めたら、呼び出し元でブール値が設定されているかどうかを確認します。設定されていない場合は、そのスレッドを停止する必要があります。

4

1 に答える 1

2

最も単純なケースでは、Thread + 任意の Runnable を使用できます。

呼び出し元の観点から呼び出しをブロックする場合は、ワーカー スレッドを実行し、Thread.join(long)を使用して操作が完了するまで待機するか、指定されたタイムアウト後に操作を破棄する「サービス」クラスを作成できます。 (物事が台無しにならないように、InterruptedExceptionの適切な処理に特に注意してください)。

Thread.isAlive()は、スレッドが終了したかどうかを示します。

結果を取得することは別の問題です。私はあなたがそれに対処できると思います...

[編集]

簡単な例 (本番環境でそのまま使用しないでください! ):

/**
 * Actually needs some refactoring
 * Also, did not verify for atomicity - should be redesigned
 */
public V theServiceCall(final T param) {
    final MyResultBuffer<V> buffer = new MyResultBuffer<V>();
    Runnable task = new Runnable() {
        public void run() {
            V result = ejb.process(param);
            buffer.putResult(result);
        }
    }
    Thread t = new Thread(task);
    t.setDaemon(true);
    t.start();
    try {
        t.join(TASK_TIMEOUT_MILLIS);
    } catch (InterruptedException e) {
        // Handle it as needed (current thread is probably asked to terminate)
    }
    return (t.isAlive()) ? null : buffer.getResult();
}

注: Thread.setDaemon() の代わりに、Runnable にシャットダウン フラグを実装することができます。

[/編集]

于 2013-03-06T12:51:03.450 に答える