Events 事件在消息驱动Bean中不起作用

Events 事件在消息驱动Bean中不起作用,events,jakarta-ee,cdi,Events,Jakarta Ee,Cdi,我试图在MDB收到消息时生成并处理事件。以下是我正在做的: public class MDBBooks implements MessageListener { @Inject private Event<Update> messageReceived; public MDBLibri() { } @Override public void onMessage(Message message) { System.out.println("Message received

我试图在MDB收到消息时生成并处理事件。以下是我正在做的:

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");
}

}
公共类MDBBooks实现MessageListener{
@注入
收到私人事件消息;
公共MDBLibri(){
}
@凌驾
消息(消息消息)上的公共无效{
System.out.println(“收到的消息”);
试一试{
updateu=message.getBody(Update.class);
收到信息。火灾(u);
如果(u!=null){
东西
}
}捕获(JMEX){
System.out.println(“JMSException:+ex.getMessage());
}
}
public void eventHandler(@Update-up){
System.out.println(“有一个更新”);
}
}

但它就是不起作用,字符串“There was a update”没有打印在glassfish控制台中。我真的说不出问题出在哪里,我的课本也是这样写的。我假设事件触发正常,但没有通知事件处理程序

观察者方法没有得到通知是正确的。事实上,CDI甚至不知道它的存在。原因是在CDI中,消息驱动bean是非上下文对象。为了简化,它们不被认为是CDIBean,但您仍然可以将它们注入并拦截它们

现在,要让CDI识别观察者方法,您必须将其放置在托管bean或会话bean中。引用规范:

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


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

正确的是,观察者方法没有得到通知。事实上,CDI甚至不知道它的存在。原因是在CDI中,消息驱动bean是非上下文对象。为了简化,它们不被认为是CDIBean,但您仍然可以将它们注入并拦截它们

现在,要让CDI识别观察者方法,您必须将其放置在托管bean或会话bean中。引用规范:

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


因此,您的解决方案是将您的observer方法放在另一个类中,即托管bean或会话bean。

在Well中有一个类似的答案(带有实现)。。。OP在这里需要的整个“实现”是将observer方法移动到另一个类中。事实上,我的评论只是为了让OP看一看(我可能可以用更好的措辞)。你的答案非常正确,我也投了赞成票。谢谢,不知何故,我错过了MDB不被认为是CDIBean的说法。在Well中也有类似的答案(带有实现)。。。OP在这里需要的整个“实现”是将observer方法移动到另一个类中。事实上,我的评论只是为了让OP看一看(我可能可以用更好的措辞)。你的答案非常正确,我也同样投了赞成票。谢谢,不知何故,我错过了MDB不被认为是CDIBean的观点。