2012-06-12 84 views
2

我試圖利用.NET Kaazing客戶端通過Web套接字與JMS後端進行交互。我正在努力理解會話的正確用法。起初,我不得不在所有線程共享一個會話,但我注意到,這是not supportedJMS客戶端會話使用

A Session object is a single-threaded context for producing and consuming messages. Although it may allocate provider resources outside the Java virtual machine (JVM), it is considered a lightweight JMS object.

我有一個會議的原因是,只是因爲我認爲這會產生更好的性能。由於文檔聲明的會話是輕量級的,我毫不猶豫地將我的代碼切換到每個「操作」使用會話。通過「操作」,我的意思是發送單個消息,或者訂閱隊列/主題。在前一種情況下,會話短暫並在消息發送後立即關閉。在後一種情況下,只要訂閱處於活動狀態,會話就需要存活。

當我試圖創建多個會話我得到了一個錯誤:

System.NotSupportedException: Only one non-transacted session can be active at a time 

谷歌搜索這個錯誤是無果而終,所以我試圖切換到事務處理會話。但是,試圖創建一個消費者,當我得到一個不同的錯誤:

System.NotSupportedException: This operation is not supported in transacted sessions 

這樣看來我是一個岩石和硬地之間卡住。我看到的唯一可能的選擇是在線程之間共享我的會話,或者讓一個單獨的非事務處理會話用於創建消費者,併爲其他事務處理多個事務處理會話。這兩種方法對我來說都顯得有點不利。

任何人都可以在我的客戶端處理會話時瞭解正確的方式嗎?

回答

0

有幾種方法可以將併發性添加到您的應用程序。您可以使用多個連接,但由於網絡開銷增加,這可能不合需要。更好的做法是實現一個簡單的機制來處理Message Listener中的併發,方法是分派任務或通過ConcurrentQueues傳遞消息。以下是實施策略的一些選擇:

  1. 基於任務的方法將使用TaskScheduler。在MessageListener中,將安排一項任務來處理工作並立即返回。例如,您可以爲每條消息安排一個新的任務。此時,MessageListener將返回並且下一條消息將立即可用。這種方法對於低吞吐量的應用 - 例如,每秒幾條消息 - 但是,如果需要併發性,可能是因爲某些消息可能需要很長時間才能處理。

  2. 另一種方法是使用待處理工作的消息數據結構(ConcurrentQueue)。當調用MessageListener時,每個Message都將被添加到ConcurrentQueue並立即返回。然後,一組獨立的線程/任務可以使用適用於您的應用程序的策略從該ConcurrectQueue中獲取消息。這將適用於更高性能的應用程序。

  3. 這種方法的一種變化是爲每個線程處理入站消息都有一個ConcurrentQueue。這裏MessageListener不會管理自己的ConcurrentQueue,而是將消息傳遞給與每個線程關聯的ConcurrentQueue。例如,如果您的入站郵件代表庫存和新聞訂閱,則一個線程(或一組線程)可以處理庫存訂閱消息,另一個可以分別處理入站新聞消息。

請注意,如果您正在使用JMS隊列,每個消息將被隱時承認了MessageListener的回報。這可能是也可能不是您想要的應用程序行爲。

對於更高性能的應用程序,你應該考慮的方法2和3

+0

感謝您的回答,但你不真正解決我的問題。我不知道何時以及如何創建*會話* - 併發處理收到的消息不是我的問題。我目前的做法是創建一個單一的,長期的,非交易的會話,從中創建所有消費者。然後,對於我需要發送的每條消息,我創建一個短期的交易會話來發送消息。這似乎工作,但似乎相當複雜。你能評論我的方法嗎? –