Spring集成提供非反应式入站/出站WebSocket适配器,只需通过内部容器将会话与id关联,即可对消息进行一些处理,然后在出站时,它会检查消息标头中的会话id,并通过发送该会议。
现在,随着Spring通过org.springframework.web.reactive.socket.WebSocketSession和其他类提供响应式WebSocket支持,我想知道响应式WebSocket堆栈的通道适配器是否也有类似的支持。
如果没有,是否有任何通用的模式/做法,如何将响应式WS与spring-integration消息流进行集成?
答案 0 :(得分:1)
此功能尚未被调用,因此我们尚未对此事进行思考。
请查看我的SandBox。对于目前的情况,这是最好的建议。
我们只是遵循标准的Spring WebFlux建议来实现WebSockets解决方案。因此,我们有一个WebSocketHandler
实现,带有适当的URL映射。该实现只是将Flux
中的session.receive()
转发到动态注册的IntegrationFlow
中。然后,该流转换为用于Publisher
的反应式session.send()
。
我相信可以使用许多其他方法,例如使用FluxMessageChannel
暗示的subscribeTo()
bean及其handle(WebSocketSession)
将Flux
桥接到预定义的Integration流中。或从@MessagingGateway
进行简单的doOnNext()
调用。
不过,不确定session.send()
是否可以在下游独立使用(需要播放),但是您可以在示例中看到如何将WebSocketSession
传播到MessageHeaders
中以给出它可以在集成流程中访问。
答案 1 :(得分:0)
感谢您的见解,Artem,他们提供了很多帮助。
这就是我最终要做的:
从处理程序中,我只需将接收到的消息发送到我的频道以接受它们:
public class FakeWebSocketHandler implements WebSocketHandler {
@Override
public Mono<Void> handle(WebSocketSession session) {
session.receive()
.map(wsm -> MessageBuilder.withPayload(wsm).build())
.subscribe(subscriberChannel::send);
return Mono.never();
}
}
在流程的最后,下游,在最终的服务激活器中,我发送响应:
public class FakeResponder extends AbstractMessageHandler {
@Override
protected void handleMessageInternal(Message<?> message) {
final WebSocketSession session = ...; // obtain WebSocketSession for this message
session.send(Mono.just(message.getPayload())
.map(this::convertToSomeByteRepresentation)
.map(bb -> session.binaryMessage(dbf -> dbf.wrap(bb)))
).subscribe();
}
}