在无状态会话 Bean 中处理 CDI 事件



我试图了解 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 次"陷阱"。我说的对吗?

不,只有一次。服务器将选择一个实例用于通知,而不是所有实例。如果它们是不同的类型,那么您应该收到每种类型的通知。

最新更新