我试图了解 CDI 事件的工作原理,以便在我的应用程序中实现它们的用法,其结构如下:我有一个启动套接字服务器的 JCA 资源适配器。然后,我有一个映射为此资源适配器端点的 MDB。现在,当我通过套接字服务器收到一条消息时,我想将此消息通知无状态 bean 池。此消息包含无状态会话 Bean 在来自 Web 服务的某些其他请求上执行某些工作所需的数据。
我创建了一个实现本地和远程接口的无状态会话 Bean。本地的声明了一个侦听注册方法。
@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 次"陷阱"。我说的对吗?
不,只有一次。服务器将选择一个实例用于通知,而不是所有实例。如果它们是不同的类型,那么您应该收到每种类型的通知。