2013-02-05 9 views
5

複数のバックエンドモジュール(EJB)といくつかのWebモジュール(WAR)を含むエンタープライズアプリケーションアーカイブ(EAR)があります。EARとしてパッケージ化されたWAR内のCDIイベントを監視することは可能です

イベントは、バックエンドモジュールの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
  • グアバEventBus
  • ...

はCDIで動作するものはありますか?おそらく、イベントをWARに橋渡しするCDI拡張がありますか?

----------- EDIT:

私はそれは同じWAR内で発射された場合、イベントを観察することができています。 また、イベントリスナーとして@Stateless Beanを成功せずに使用しようとしました。 (イベントはここでトリガーされます)

  • EAR
    • WAR(イベントはここで観察されなければならない)
    • WAR
    • EJB:

      パッケージングは​​、このようなものです

+0

ファイルを使用すると、 '/ WEB-INF/beans.xml' –

+0

を持ってはい... beans.xmlのファイルが所定の位置にあります。 – psartini

+0

WARイベントリスナー(インスタンス化して使用する方法を理解するためのもので、おそらくCDIはBeanインスタンスを認識していません...)を投稿してください。詳細なパッケージ記述も役立ちます。 –

答えて

3

もう少し研究を重ねると、そのWARクラスはEJBには表示されないため、予期される動作が発生します。

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

この場合、JMSまたは別のメッセージングシステムが明らかに移動する方法です。 はCDI <ために利用可能なCDI拡張もあります - > JMSブリッジング:あなたWARにきっとSeam3 JMS

関連する問題