2017-04-10 82 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看到(我可能會更好地表達它)。你的回答是非常正確的,我已經投票相應 –