如何将StompSubProtocolHandler与int-websocket:client-container一起使用

时间:2015-03-20 19:46:43

标签: spring-integration spring-websocket

我有一个Websocket Stomp Client的基本设置。问题是StompSubProtocolHandler,WebsocketInboundChannelAdapter和WebsocketOutboundMessageHandler将消息视为应用程序是服务器。

根据邮件是入站还是出站,邮件会得到特殊处理。

例如,我通过带有simpMessageType =“CONNECT”的出站通道适配器发送消息,并且StompSubProtocolHandler的handleMessageToClient [谢天谢地]不执行它应该对CONNECT消息执行的操作,因为它不期望这样做要发送的消息。

然后返回CONNECTED [CONNECT_ACT]消息并由StompSubProtcolHandler的handleMessageFromClient函数处理。此函数不知道如何处理此CONNECTED帧,而不是publishEvent,它尝试将消息发送到outputChannel。这可以,但WebsocketInboundChannelAdapter知道simpMessageTypes并忽略该消息,因为它不是“MESSAGE”类型。

我觉得必须有一些我不知道的客户端websocket通道适配器。我也觉得必须有一些StompSubProtocolHandler,它也是为客户设计的。没有很多使用int-websocket的示例应用程序:客户端容器,我不知道该怎么做。

有人可以帮我理解我需要做什么来处理作为websocket客户端的STOMP消息吗?

<int-websocket:client-container id="websocketClientContainer"
                                client="websocketStompClient" 
                                uri="ws://localhost:8080/stomp" />

<bean id="stompSubProtocolHandler"
      class="org.springframework.web.socket.messaging.StompSubProtocolHandler"/>

<int-websocket:inbound-channel-adapter 
             channel="receiveMessage"
             container="websocketClientContainer"
             default-protocol-handler="stompSubProtocolHandler"/>

<int:channel id="receiveMessage" />

<int:service-activator ref="websocketStompClient" 
         method="receiveNotification" 
         input-channel="receiveMessage" 
         output-channel="nullChannel" />

<int-event:inbound-channel-adapter 
      event-types="org.springframework.web.socket.messaging.AbstractSubProtocolEvent"
      payload-expression="message"
      channel="routeStompEvents"/>

<int:channel id="routeStompEvents" />

<int:router ref="StompInboundMessageTypeRouter"
                method="routeStompMessage"
                input-channel="routeStompEvents" 
                default-output-channel="nullChannel" 
                resolution-required="false" />

2 个答案:

答案 0 :(得分:1)

Spring-WebSockets目前还没有客户端支持,因此我们目前仅限于支持服务器端。

然而,它只是committed to master(上周),将在春季4.2。我们还将为Spring Integration 4.2添加适当的支持。

JIRA问题有一个指向提交的链接,包括测试等。

答案 1 :(得分:0)

好吧,我想确认CONNECT作为来自<int-websocet:outbound-channel-adapter>client的消息的效果很好。

我们刚刚错过了StompCommand.CONNECTED来自WebSocketInboundChannelAdapter的{​​{1}}处理client,看起来应该作为SessionConnectedEvent作为来自服务器的确认发出。< / p>

另一个错过的STOMP帧是StompCommand.RECEIPT,应该像新的StompReceiptEvent一样发出。

随时可以就此问题提出JIRA问题,之后我们会先查看stomp-chat以添加Java客户端。

与STOPM进行更顺畅的集成,我们可以通过一些新的int-stopm components来解决这个问题。

<强>更新

关于此事的JIRA:https://jira.spring.io/browse/INT-3686 要使用适配器完全支持STOMP协议,我们还有另一张票:https://jira.spring.io/browse/INT-3685