2016-04-27 147 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统计信息,所以有一个时间窗口,您有点落后。 –