簡體   English   中英

Tibco EMS會話共享連接對象

[英]Tibco EMS Session sharing Connection object

最初,我們與EMS代碼的連接設計不當,並為我們偵聽的每個主題創建了一個TopicConnection對象。 因此,實際上,無論何時訂閱主題,我們都會創建一個新的連接,一個新的會話以及最后一個新的偵聽器。

我們想切換到單個連接模型。 盡管我可以通過共享一個連接對象並為每個主題創建一個新的會話對象輕松地在我們的代碼中執行此操作,但是我們不確定如果沒有代碼,這是否會引起任何問題。

我的理解是Tibco EMS客戶端庫在共享連接方面是線程安全的。 實際上,連接只是一個管道,會話可以以線程安全的方式重新使用此管道。

這個假設是正確的還是更多呢?

.NET EMS API基於JMS 在JMS中,將Connection和Session對象指定為線程安全的,並且可以在程序中重用。 您非常正確,因為Connection對象只是表示通向EMS服務器的網絡管道。 EMS用戶指南指出:

連接是一個重量級的對象,因此大多數客戶端將創建一次連接並將其保持打開狀態直到客戶端退出。 如果需要,您的應用程序可以創建多個連接。

關於會話:

會話是用於生成或使用消息的單線程上下文。 您使用會話對象創建消息生產者或消息使用者。

本質上,除非您需要非常大的容量並遇到性能限制,否則在您的應用程序中僅使用一個連接是絕對安全的。 該會話控制在其中創建的任何生產者或消費者的交易/確認語義,但是再次可以安全地重用。 我可能會對具有不同生命周期的應用程序中存在的模塊使用單獨的會話(請考慮應用程序服務器中的單獨部署單元)。

您的EMS服務器安裝將包含帶有各種代碼的示例目錄(類似於C:\\ tibco \\ ems \\ 5.0 \\ samples \\ cs )。 csTopicSubscriber.cs中的代碼顯示了如何編寫單線程主題使用者。 沒有多線程主題使用者示例,但是csMsgConsumerPerf.cs演示了如何使用隊列。

完成創建后的所有對象,請確保將它們清理干凈-例如,完成后關閉主題使用者對象,會話和連接。 與預取和容錯重新連接設置結合使用時,如果沒有關閉手柄,則泄漏手柄會導致無法預料的行為。

同意一個較早的答案:不得在線程之間共享JMS會話,但可以(應該)共享。 因此,每個應用程序一個連接就可以了(確保只啟動/關閉一次)-最好在創建單個線程之前/之后。

然后每個線程創建並使用一個會話。 請記住,當您關閉一個Session時,它將阻塞直到所有接收到的回調都真正返回為止。 因此,請勿在回調的onMessage()中調用close()。

我認為是的,只要共享位於同一應用程序(exe,二進制文件)內即可。 我們共享了相同的連接對象,並在我們的代碼中將其用作單例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM