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

How do I use the StompSubProtocolHandler with the int-websocket:client-container

我有一个 Websocket Stomp 客户端的基本设置。问题在于 StompSubProtocolHandler、WebsocketInboundChannelAdapter 和 WebsocketOutboundMessageHandler 将消息视为应用程序是服务器。

根据邮件是入站还是出站邮件进行特殊处理。

例如,我通过带有 simpMessageType="CONNECT" 的出站通道适配器发送消息,而 StompSubProtocolHandler 的 handleMessageToClient [谢天谢地] 没有执行它应该对 CONNECT 消息执行的操作,因为它确实不要指望发送这样的消息。

然后 CONNECTED [CONNECT_ACT] 消息返回并由 StompSubProtcolHandler 的 handleMessageFromClient 函数处理。此函数不知道如何处理此 CONNECTED 帧,它尝试将消息发送到 outputChannel 而不是 publishEvent。这会没问题,除非 WebsocketInboundChannelAdapter 知道 simpMessageTypes 并忽略消息,因为它不是 "MESSAGE" 类型。

我觉得一定有某种我不知道的客户端 websocket 通道适配器。我还觉得必须有某种 StompSubProtocolHandler 是为客户设计的。使用 int-websocket:client-container 的示例应用程序并不多,我不知所措。

任何人都可以帮助我理解作为 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" />

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

但是,它刚刚 committed to master(上周)并将在 Spring 4.2 中。我们还将为 Spring Integration 4.2 添加适当的支持。

JIRA 问题有一个 link 提交,包含测试等

好吧,我想确认 CONNECT 作为从 client 方发送给 <int-websocet:outbound-channel-adapter> 的消息效果很好。

我们刚刚错过了从 client 端处理 WebSocketInboundChannelAdapter 中的 StompCommand.CONNECTED,这看起来应该作为 SessionConnectedEvent 作为来自服务器的确认发出.

另一个错过的 STOMP 帧是 StompCommand.RECEIPT,它应该像一些新的 StompReceiptEvent.

一样发出

之后随时提出 JIRA issue on the matter, and we'll take a look to the stomp-chat 以添加 Java 客户端。

与作为客户端的 STOPM 更顺畅地集成,我们可以使用一些新的 int-stopm components

更新

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