【问题标题】:Handling CDI Events in Stateless session beans在无状态会话 bean 中处理 CDI 事件
【发布时间】:2012-11-21 14:46:18
【问题描述】:

我正在尝试了解 CDI 事件的工作原理,以便在我的应用程序中实现它们的使用,其结构如下: 我有一个启动套接字服务器的 JCA 资源适配器。 然后我有一个映射为该资源适配器端点的 MDB。 现在,当我通过套接字服务器收到一条消息时,我想将此消息通知一个无状态 bean 池。此消息包含无状态会话 Bean 所需的数据,以根据来自 Web 服务的其他一些请求执行某些工作。

我创建了一个实现本地和远程接口的无状态会话 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 Resource Adapter接收的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”。我说的对吗?

【问题讨论】:

    标签: jakarta-ee ejb cdi


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答。好吧,实际上阅读specs,我注意到该事件被称为bean 的“上下文实例”。所以现在的问题变成了“我怎样才能通知所有池实例发生了什么事?”。到目前为止,我认为最好的解决方案是将这些信息写入数据库,并在容器提供服务时让 bean 读取它。
    猜你喜欢
    • 2014-04-06
    • 1970-01-01
    • 1970-01-01
    • 2014-12-26
    • 1970-01-01
    • 2012-05-11
    • 2011-03-31
    • 2013-08-02
    • 2011-01-02
    相关资源
    最近更新 更多