2012-12-20 35 views
3

我們希望在同一過程的不同線程上運行我們的cms::MessageConsumercms::MessageProducerActiveMQ線程安全嗎?

我們如何安全地做到這一點?

將有兩個cms::Connection對象和兩個cms::Session對象,消費者和生產者各一個,足以保證安全嗎?這是必要的嗎?

在靜態庫級別的對象之間是否存在可以防止此類用法的共享狀態?

回答

4

您應該閱讀JMS v1.1規範,它清楚地調出哪些對象在多個線程中有效,哪些不是。即會話,MessageConsumer和MessageProducer被認爲是不安全的以在線程之間共享。我們通常儘量使它們儘可能地安全,但肯定有一些方法可以讓你陷入困境。在每個線程中使用單個會話通常是一個好主意,並且一般來說,爲每個MessageConsumer/MessageProducer使用一個會話是個好主意,因爲Session包含單個分派線程,這意味着與許多使用者的會話必須共享其分派線程用於將消息發送給每個消費者,這可以根據場景降低延遲。

+0

請澄清最後一句。 – ThomasMcLeod

+0

增加了一點,其中大部分內容已經在博客文章和規範中了,所以我不會在這裏重現。 –

2

據我從Java方知道,連接是線程安全的(和相當昂貴的創建),但會議的MessageProducer不是線程安全的。因此,你應該爲你的每個線程創建一個Session。

+2

你怎麼知道的,有沒有關於這一點的任何文件? – ThomasMcLeod

4

我在回答我自己的問題以補充Tim Bish的答案,我接受這個答案是提供了必要的信息。

http://activemq.apache.org/cms/cms-api-overview.html

什麼是CMS?

CMS API是Java中JMS API的C++推論,用於 發送和接收來自位於同一臺計算機上的網絡上的客戶端或位於同一臺計算機上的 的消息。在CMS中,我們儘可能保持與JMS API儘可能多的奇偶校驗,當JMS特性強烈依賴Java 編程語言本身的特性時,它們只會分歧 。儘管存在一些差異,但大部分內容都很小,大部分CMS遵守JMS 規範,因此,牢牢掌握JMS的工作方式應該使CMS更容易。

JMS規範對線程安全性有何評論?

下載規格這裏: http://download.oracle.com/otndocs/jcp/7195-jms-1.1-fr-spec-oth-JSpec/

2.8多線程JMS可能要求其所有對象都支持同時使用。由於對併發訪問的支持通常會增加一些開銷和複雜性,因此JMS設計限制了對多線程客戶端自然會共享的那些對象的併發訪問的要求 。其餘部分是 ,設計爲一次由一個邏輯控制線程訪問。 JMS定義了一些限制併發使用會話的特定規則。因爲它們需要JMS細節的更多的知識比我們 在

已經提出 是支持併發使用

  • 目標

    表2-2 JMS對象:是

  • 連接工廠:是
  • 連接:是
  • Session:NO
  • MessageProducer:NO
  • MessageConsumer:NO

這一點,他們將在後面介紹。這裏我們將描述實施它們的基本原理 。

限制對會話的併發訪問有兩個原因。首先,會話是支持事務的JMS實體。很難實現多線程的事務,這是 。其次,會話支持異步消息消費。重要的是,JMS不要求用於異步消息的客戶端代碼能夠處理多個併發的消息。另外,如果一個會話已經建立了多個異步使用者,重要的是客戶端並不是強制 來處理這些單獨使用者同時執行的情況。這些限制使JMS更易於用於典型的 客戶端。更復雜的客戶可以通過使用多個會話來獲得他們想要的併發性。