2017-04-10 19 views
0

MDBがメッセージを受信したときにイベントを生成して処理しようとしています。ここで私がやっているものです:メッセージ駆動型Beanでイベントが機能しない

public class MDBBooks implements MessageListener { 
@Inject 
private Event<Update> messageReceived; 

public MDBLibri() { 
} 

@Override 
public void onMessage(Message message) { 
    System.out.println("Message received"); 
    try { 
     Update u = message.getBody(Update.class); 
     messageReceived.fire(u); 
     if(u != null){ 
      ... stuff   
     } 
    } catch (JMSException ex) { 
     System.out.println("JMSException: " + ex.getMessage()); 
    } 
} 

public void eventHandler(@Observes Update up) { 
    System.out.println("There was an update"); 
} 

} 

をしかし、それだけでは動作しません、文字列は、それがGlassFishのコンソールに印刷されていない「アップデートがありました」。私は本当に何が問題なのかは分かりません。私の教科書はそれと同じようにしています。私はイベントが正常に発生すると仮定していますが、イベントハンドラは通知されません。

答えて

2

オブザーバーメソッドには通知されません。です。実際には、CDIはそれが存在することを知らない。その理由は、CDIではメッセージ駆動型Beanが非コンテキスト・オブジェクトであるためです。簡単にするため、CDI Beanとは見なされませんが、まだCDI Beanに挿入して傍受することはできます。

ここで、CDIがオブザーバーメソッドを認識するためのは、マネージドBeanまたはセッションBeanに配置する必要があります。

オブザーバーメソッドは、マネージドBeanクラスまたはセッションBeanクラス(またはコンテナライフサイクルイベントで定義されている拡張機能)の非抽象メソッドです。

したがって、オブザーバーメソッドを別のクラス(マネージドBeanまたはセッションBean)に配置することができます。

+0

[それ以外は関係のない質問](実装に関する)と同様の回答があります(http://stackoverflow.com/questions/43111276/observable-pattern-in-remote-ejb/43120204#43120204) –

+0

OPがここで必要とする "実装"全体は、オブザーバメソッドを別のクラスに移動することです。 – Siliarus

+0

確かに、私のコメントは、OPのためだけに(私はおそらくそれをより良いと言えるかもしれない)見るためのものとして意図されていた。あなたの答えは正しかったので、私はそれに応じて投票しました –

関連する問題