2015-03-24 58 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

回答