2012-11-21 41 views
0

我試圖理解CDI事件如何在我的應用程序中實現它們的用法,它的結構如下: 我有一個啓動Socket服務器的JCA資源適配器。 然後我有一個映射爲此資源適配器端點的MDB。 現在,當我通過套接字服務器收到一條消息時,我想通知一個無狀態bean池。此消息包含無狀態會話Bean需要的數據,以處理來自Web服務的其他某些請求。在無狀態會話bean中處理CDI事件

我創建了一個實現本地和遠程接口的無狀態會話Bean。 本地聲明一個listenToRegistration方法。

@Stateless(...) 
public class myBean implements MyRemoteInterface,MyLocalInterface{ 
    ... 

    public void listenToEvent(@Observes EventMessage eventMessage){ 
     logger.info("gotcha!"); 
    } 
} 

本地接口的定義如下

@Local 
public interface MyLocalInterface { 
    public void listenToEvent(@Observes EventMessage eventMessage); 
} 

從JCA資源適配器接收的MDB是這樣

@MessageDriven(...) 
public class messagerMDB implements MessageEndpoint { 
    @Inject 
    Event<EventMessage> events; 

    ... 

    @Override 
    public void onMessage(String message) throws Exception { 
     ... 
     events.fire(message); 
    } 

} 

現在,假設在某個時間點我在池中有20個myBean實例。 當我收到一條消息時,我希望閱讀20次「gotcha」。我對嗎?

回答

3

不,只是一次。服務器將選擇一個實例用於通知,而不是全部。如果他們是不同的類型,那麼你應該收到每種類型的通知。

+0

感謝您的回答。實際上,通過閱讀[specs](http://www.jcp.org/en/jsr/detail?id=299),我注意到事件被引用到bean的「上下文實例」中。所以現在的問題變成了「我如何通知所有池實例發生了什麼?」。到目前爲止,我認爲最好的解決方案是將這些信息寫入數據庫,並讓bean在容器提供服務時讀取它。 – fabpicca