2012-11-21 42 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