2016-04-27 153 views
0

我有以下駱駝路由,它偵聽ActiveMQ主題上的消息,並立即將它們發送到所有連接的Web套接字客戶端。這工作正常,但只要初始化路由構建器就會連接到主題。從駱駝websocket連接/斷開ActiveMQ主題連接/斷開

from("activemq:topic:mytopic").routeId("routeid").to("websocket://test?sendToAll=true"); 

我需要的是隻連接到該主題時,一個或多個客戶端連接到網絡插座。一旦沒有更多的連接,我想停止聽這個話題。這可能嗎?

回答

1

根據我沒有適當的方法來做到這一點。這可以實現的唯一方法是覆蓋Jetty WebSocket代碼。一旦您重寫Jetty Websocket代碼,您就可以靈活地在打開和關閉websocket中編寫自己的自定義代碼。

  • 爲打開的websocket中的所有websocket客戶端維護一個列表。檢查關閉websocket並將其從列表中刪除,以瞭解有多少個已連接或斷開連接。或者在打開和關閉websocket上保留一個計數器。
  • 所有websocket客戶端關閉後,請暫停路由,以便您的消息保留在主題或隊列中。
  • 如果任何客戶端連接到websocket,則恢復路由,以便消息到達連接的特定客戶端。
+1

是的,這是正確的。我們可以考慮讓一個from(websocket:test?events = onConnect,onDisconnect),以便您可以過濾事件,然後將其用作路由,然後您可以調用controlbus使用AMQ主題掛起/恢復其他路由。 –

+0

@ClausIbsen這些事件的增加肯定會有幫助。將它添加到Atmosphere-websocket組件也是有意義的。在短期內,我認爲我可以利用JMX功能輪詢連接數量並相應地暫停路由。思考? –

+0

是的,歡迎您登錄JIRA:http://camel.apache.org/support.html。如果您可以在JMX中找到詳細信息,那麼您可以使用它來控制AMQ路線。因爲您需要安排輪詢JMX統計信息,所以有一個時間窗口,您有點落後。 –