6

次の状況が発生します(JBoss AS6およびAS7で実行)。

  • スケジュールされたメソッドを持つシングルトンEJB。
  • タイプの注入されたイベントSomethingChangedEvent

次の例を検討してください。

@Singleton
public final class Scheduler {
    @Inject
    private Event<SomethingChangedEvent> event;

    @Schedule
    private void scheduleSomething() {
        event.fire(new SomethingChangedEvent());
    }
}

このイベントがサーバー上のある種のキューに追加され、それによって配布されることを期待します。を使用してこの種のイベントを監視するメソッドはすべて@Observers通知されます。event.fire()メソッドはすぐに戻ります。

ただし、次の問題に直面します。event.fire()メソッドが戻るのに2〜3分かかることがあり、10秒に1回呼び出されると想定されているため、スケジュールに大混乱が発生します。

したがって、質問は次のとおりです。これはどのように可能ですか?発生したイベントはどうなりますが、誰もそれらを観察しませんか?オーバーフローする可能性のあるキューはありますか?

よろしく、スヴェン

4

1 に答える 1

7

CDIイベント処理は同期的に発生します。実際には、非同期処理モデルを仕様に含めるという提案がありますが、まだ投票中です。それまでの間、非同期処理を「強制」する方法は2つあります。

  1. JMSを使用する-はい、これは古いJava EEテクノロジーに戻っているため、ごちゃごちゃしています。しかし、それは機能します
  2. プロデューサーメソッドとオブザーバーメソッドの両方で@Asynchronousメソッドを使用して、これらのメソッド呼び出しを個別のコンテナー管理スレッドに分割します。

コード例に2番目のメソッドを適用する:

@Singleton
public final class Scheduler {
    @Inject
    private Event<SomethingChangedEvent> event;

    @Asynchronous
    private void scheduleSomething() {
        event.fire(new SomethingChangedEvent());
    }
}
于 2013-01-24T12:03:16.123 に答える