2013-03-21 126 views
2

我有一個Web應用程序,我正在重寫當前執行大量的審計數據sql寫入。用戶交互的每一步都會產生一個將某些信息寫入數據庫的方法。 這有可能通過導致交互停止由於數據庫問題而影響用戶。Java內部消息隊列/ JMS

理想情況下,我想移動這是一種基於消息的方法,如果需要寫入數據,它也會被排除在隊列之外,消費者將其選中並將其寫入數據庫。這不是重要數據,如果服務器出現故障,丟失是可以接受的。

如果我應該嘗試使用嵌入式JMS隊列和代理或Java隊列,我只是有點困惑。或者我不熟悉的東西(建議?)

什麼是最好的方法?

更多信息: 該應用程序使用spring並運行在websphere 6.所有消息通信是本地的,它不會與另一臺服務器通信。

+0

您可以使用ActiveMQ .. – Anubhab 2013-03-21 06:14:01

+0

@Anubhab,ActiveMQ嵌入在WebSphere中,當已經有一個JMS代理運行時,真的嗎? – 2013-03-26 22:42:30

回答

0

只有在涉及不同的服務器時,我纔會使用JMS隊列。所以在你的情況下,我會用簡單純Java和一些Java隊列來完成它。

1

我認爲使用JMS進行日誌記錄是矯枉過正的,特別是如果登錄是使用JMS的唯一原因。

看看DBAppender,你可以直接登錄數據庫。如果性能是您關心的問題,那麼可以使用Logback進行異步日誌記錄。

如果你還想去JMS方式的logback然後有JMS Queue & Topic追加程序

+0

要明確,日誌記錄正在將審計信息(此時用戶x執行此操作)寫入SQL數據庫。我不是指應用程序日誌記錄。 – NathanS 2013-03-21 07:43:54

+0

我的答案應該用於審計或應用程序日誌:) – 2013-03-21 09:07:13

1

一個普通的隊列就足夠了根據您的問題描述。您可以擁有一個固定大小的隊列並放棄消息,因爲您認爲他們並不重要。

需要考慮的事情:

  • 被其他應用程序需要太多,現在或將來 此功能。
  • 生產郵件的速度如此之大,以至於當大量用戶登錄時,它可以啓動 消耗大量堆內存。 英寸重要的是,如果郵件不應該丟失。
1

但我不確定這是否是Java EE容器內的最佳實踐。

由於您已經在WebSphere機器上運行,所以您確實有一個JMS代理(SIBus)。啓動異步事件的最簡單方法是發送JMS消息並讓MDB讀取它們並執行數據庫插入操作。您可能在WebSphere中產生自己的線程時仍然可以使用JNDI資源的初始上下文。

在非Java EE的情況下,我會使用類似於普通LinkedBlockingQueue或任何阻塞隊列的東西,並且只需要一個線程輪詢該隊列以便將新消息插入到數據庫中。

+0

我知道有關WebSphere中spawn線程的問題 - 但已經找到了解決此問題的方法,即使用工作池。我不熟悉SIBus - 這可以用作內部經紀人嗎?那麼只需創建一個內部隊列並通過JNDI引用它呢?在這種情況下,您是否還有更多關於使用SIBus的參考資料 - 從快速谷歌我只能找到高級IBM信息 – NathanS 2013-03-25 23:43:46

+0

這出現在谷歌搜索的頂部,並涵蓋您需要:http://www.ibm.com/developerworks /websphere/techjournal/0504_reinitz/0504_reinitz.html – 2013-03-26 06:34:47