Event not working in Message Driven Bean

时间:2017-04-10 02:33:42

标签: events java-ee cdi

I'm trying to generate and handle an event when my MDB receives a message. Here is what I'm doing:

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

}

But it just does not work, the string "There was an update" it's not printed in the glassfish console. I can't really tell what's the problem, my textbook does it the same way pretty much. I'm assuming the event fires fine, but the event handler isn't notified.

1 个答案:

答案 0 :(得分:2)

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

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

  

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

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