2017-04-10 83 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或会话bean。引用规范:

观察者方法是托管bean类或会话bean类(或Container定义的生命周期事件中定义的扩展)的非抽象方法。

因此,您的解决方案将您的观察者方法放在另一个类,它是一个托管的bean或会话bean。

+0

有一个在[其它不相关的问题(http://stackoverflow.com/questions/43111276/observable-pattern-in-remote-ejb/43120204#43120204) –

+0

好了类似的回答(根据实施).. OP在这里需要的整个“实现”是将观察者方法移到不同的类。 – Siliarus

+0

的确,我的评论仅仅是为了让OP看到(我可能会更好地表达它)。你的回答是非常正确的,我已经投票相应 –