7

複数のバックエンド モジュール ( EJB ) といくつかの Web モジュール ( WAR ) を含むエンタープライズ アプリケーション アーカイブ ( EAR ) があります。

イベントは、バックエンド モジュールの 1 つの内部で発生します。

@Inject private Event<MyEvent> myEvent;
...
public void fireEvent() {
  myEvent.fire(new MyEvent());
}
...

次のようなコードを使用して、他のバックエンド モジュールのいずれかで確認できます。

public void listener(@Observes MyEvent myEvent) {
..
}

しかし、WAR 内のイベントを取得できません。これは、クラスローダーの可視性 (WAR のクラスは EJB から見えない) によるものですか、それとも CDI でこれを処理する必要がありますか?

アプリケーション全体のイベントに CDI を使用できない場合、代替手段は何ですか?

  • JMS
  • Guava EventBus
  • ...

CDIで動作するものはありますか? イベントをWARに橋渡しするCDI拡張機能でしょうか?

- - - - - - 編集:

同じ WAR 内で発生した場合、イベントを観察できます。また、 @Stateless Bean をイベントリスナーとして使用しようとしましたが、成功しませんでした。

梱包はこんな感じです。

    • WAR (イベントはここで観察する必要があります)
    • 戦争
    • EJB (ここでイベントが発生します)
4

1 に答える 1

7

さらに調査した結果、WAR クラスは EJB から見えないため、期待どおりの動作であると思われます。

よく考えてみると、これは良いことです。クラスター化された環境では、CDI イベントは、イベントを起動する EJB モジュールと同じノードで実行されている WAR によってのみ受信されます。しかし、ユーザー ビューを確実に更新するには、すべてのインスタンスでそれを受け取る必要があります。

この場合、JMS または別のメッセージング システムが明らかに適しています。CDI <-> JMS ブリッジングに使用できる CDI 拡張機能もあります: Seam3 JMS

于 2013-02-06T09:48:01.770 に答える