2015-02-11 81 views
1

ActiveMQ文檔指出Session和MessageProducer對象不是線程安全的。如果我有一組線程可以產生持久性消息,那麼如何正確地將它們發送到ActiveMQ,以瞭解特定的發送操作是否成功?正確的ActiveMQ生產者併發性

  1. 爲每個工作線程都有一個單獨的Session/MessageProducer。
  2. 創建顯式的生產者線程集並通過BlockingQueue將消息傳遞給它們(如何確定發送是否成功?)。
  3. 使用未來<>爲前一種情況在ActiveMQ中獲得持久消息的成功狀態。
  4. 只需將每個MessageProducer.sendMessage()調用包裝在同步塊中即可。

或者,也許有這種情況下的任何最佳做法。謝謝。

回答

1

訪問線程之間共享會話的一個問題,就像您在2-4中說明的是事務管理。

如果您在JMS會話中執行某些操作,那麼您需要確保知道事務何時被提交或回滾。這發生在會話對象上。多個線程在同一個會話上提交會導致錯誤。

什麼是常見的(例如,如果你看看Spring的JmsTemplate)是你打開一個新的Connection/Session/MessageProducer,發送消息,然後關閉它們。這是非常低效的,但線程安全。爲了解決效率問題,可以將ConnectionFactory包裝在PooledConnectionFactory中。該池將在需要時藉助會話/連接到您的線程,並且在會話上調用close時,它將被放回到池中。這樣,你根本不必關心線程安全。有關主題here的更多信息,請參閱。

當然,如果您正在進行一些手動管理,您可以使用您的方法1併爲每個線程保存一個會話。如果你有幾個線程發送大量消息,那應該是最有效的方法。

相關問題