2013-05-09 157 views
4

我有一些駱駝路線與米娜插座和碼頭websockets。我能夠向連接到WebSocket的所有客戶端廣播消息,但是如何向特定端點發送消息。我如何維護所有連接的客戶端列表作爲參考的客戶端ID,以便我可以路由到特定的客戶端。那可能嗎?我能否在URI中提到動態客戶端?駱駝路線「到」具體websocket端點

或者也許我在想這個錯誤,我需要在活動mq上創建主題並讓客戶端訂閱它。那意味着我爲每個websocket客戶端創建一個主題?並將消息路由到正確的主題。

我至少在正確的軌道上,你可以指出任何例子嗎?谷歌沒有幫助。

回答

0

您絕對不想爲每個客戶端創建單獨的端點。 主題和使用選擇器進行訂閱是一種解決問題的優雅方式。 我會說最好的一個。

您需要單個主題,每個客戶端都會使用選擇器來訂閱,如where clientId in ('${myClientId}', 'EVERYONE')。現在,當您想要將消息發佈到特定客戶端時,您需要將一個屬性clientId設置爲該客戶端的ID。如果你想播放,可以將其設置爲「EVERYONE」

我希望我的理解對不對這個問題...

2

你採用的方法取決於客戶端的信息是多麼敏感。單個主題與選擇器的不利之處在於,任何人都可以在沒有選擇器的情況下訂閱主題,並查看所有人的所有信息 - 通常不是您想要執行的操作。

一個更好的方案是使用消息分發機制(Camel路由集),充當websocket客戶端和產生消息的系統之間的中介。此機制負責將消息從單個目標分發到特定於客戶端的目標。我曾參與過一些使用類似計劃的銀行網絡前端。

爲了這個工作,你首先爲每個用戶生成一個獨特的標記/ UUID;這在會話建立時(通常通過某種配置文件查詢/消息)呈現給用戶。 重要的是,UUID可以作爲clientId的散列來處理,而不是存儲在數據庫中,因爲它將一直使用,並且您希望確保快速完成此操作。

然後用戶使用該信息連接到使用該UUID作爲後綴的特定主題。例如兩個用戶預訂至orderConfirmation話題將各自認購到自己的版本,話題:

clientA -> orderConfirmation.71jqsd87162iuhw78162wd7168 
clientB -> orderConfirmation.76232hdwe7r23j92irjh291e0d 

爲了保持「存在」的方式,您的客戶將需要定期發送心跳消息包含它們的clientId到知名的話題,您的分配機制監聽。客戶不應該能夠訂閱此主題的閱讀(請參閱ActiveMQ Security)。消息分發機制需要在內存中保存一個包含clientId和上次看到心跳的時間的數據結構。

當分配機制接收到消息時,它檢查接收消息的客戶端ID是否具有「現場/當前」會話,確定客戶端的UUID,並在適當的主題上廣播消息。

隨着時間的推移,這將在您的經紀商創建大量的話題,您不想在用戶離開時閒逛。您可以將ActiveMQ配置爲delete these if they have been inactive for some time