2015-03-24 118 views
0

寻找一种架构模式来解决以下问题。在Java EE 6中实现JMS缓冲层6

在我的建筑,我有一个实现此事件无状态EJB:

public void dispatchEvent(MyEvent ev)

这种方法是通过在它们的业务方法的各种其他EJB的调用。我的EventDispatcher的目的是隐藏事件分派的复杂性(无论是JMS还是其他机制)。

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

问题:我可能正在查看发送数千个单独消息的事务。某些消息可能因事务中发生的其他事件而失效(对象已更新,随后又被删除)。所以我需要大量的逻辑来根据上下文来“消磨”消息,并对它是一个大的JMS批量消息还是多个小消息做出最终决定。

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

你会怎么做?

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

+0

http://docs.oracle.com/javaee/5/api/javax/transaction/TransactionSynchronizationRegistry.html#putResource(java.lang.Object,java.lang.Object中) – 2015-03-25 02:40:41

+0

目前尚不清楚你期望在这个“回调”中能够完成的事情。 – 2015-03-26 10:21:44

回答