【发布时间】:2015-05-28 10:20:30
【问题描述】:
寻找解决以下问题的架构模式。
在我的架构中,我有一个 Stateless EventDispatcher EJB,它实现:
public void dispatchEvent(MyEvent ev)
此方法被各种其他 EJB 在其业务方法中调用。我的 EventDispatcher 的目的是隐藏事件调度方式的复杂性(无论是 JMS 还是其他机制)。
现在让我们假设我的 bean 正在使用 JMS。因此它只是查看传递给它的事件,然后构建 JMS 消息并将它们分派到正确的主题。它可以产生多个 JMS 消息,并且只有在周围事务最终成功提交(XA 事务)时才会发送它们。
问题:我可能正在查看发送数千条单独消息的交易。由于事务中发生的其他事情(对象已更新,然后后来已删除),某些消息可能会变得无效。所以我需要大量的逻辑来根据上下文“清理”消息,并最终决定它是一个大 JMS 批处理消息还是多个小消息。
解决方案:我想要的是使用某种“TransactionalContext”对象并在我的无状态 EJB 中使用它来“缓冲”所有事件。然后我需要某种回调来告诉我事务即将提交。这类似于我们使用 EntityManager 的方式,我可以对实体进行更改,它会保留更改并在无状态 EJB 之间共享。在“刷新”时间(事务完成),它会执行其逻辑来确定要执行的 SQL。我需要一个可用于我的无状态 bean 的 TransactionContext,它每个事务都有一个唯一的会话,并且在事务即将完成时有一个回调。
你会怎么做?
请注意,我不在有效的 CDI 上下文中,其中一些事务由于 @Schedule 计时器而开始。其他事务由于 JMS MDB 而开始。
【问题讨论】:
-
docs.oracle.com/javaee/5/api/javax/transaction/…, java.lang.Object)
-
不清楚你希望在这个“回调”中完成什么。
标签: java jakarta-ee transactions jms stateless-session-bean