Implementing a JMS Buffer layer in Java EE 6



寻找一种架构模式来解决以下问题。

在我的体系结构中,我有一个无状态EventDispatcher EJB,它实现了:

public void dispatchEvent(MyEvent ev)

该方法由各种其他EJB在其业务方法中调用。EventDispatcher的目的是隐藏事件调度方式的复杂性(无论是JMS还是其他机制)。

现在,让我们假设我的bean正在使用JMS。因此,它只是查看传递给它的事件,构建JMS消息并将它们分派到正确的主题。它可以生成多个JMS消息,并且只有当周围事务最终成功提交(XA事务)时才会发送这些消息。

问题:我可能正在查看发送数千条单独消息的交易。某些消息可能会因为事务中发生的其他事情而变得无效(对象更新,然后删除)。因此,我需要大量的逻辑来基于上下文"清理"消息,并最终决定它是一个大的JMS批处理消息还是多个小的JMS批消息。

解决方案:我想使用某种"TransactionalContext"对象,并在我的无状态EJB中使用它来"缓冲"所有事件。然后我需要某种回调来告诉我事务即将提交。这与我们使用EntityManager的方式类似,我可以对实体进行更改,它保留更改并在无状态EJB之间共享。在"刷新"时间(事务完成),它执行逻辑来确定要执行的SQL。我需要一个可用于我的无状态bean的TransactionContext,它每个事务都有一个唯一的会话,并且在事务即将完成时有一个回调。

你会怎么做?

请注意,我不在有效的CDI上下文中,其中一些事务是由于@Schedule计时器而启动的。其他事务是由于JMS MDB而开始的。

我相信我要找的是TransactionSynchronizationRegistry。

http://docs.oracle.com/javaee/5/api/javax/transaction/TransactionSynchronizationRegistry.html#putResource(java.lang.Object

最新更新