Spring集成和反应式WebSocket

时间:2018-09-12 08:54:24

标签: java spring websocket spring-integration spring-websocket

Spring集成提供非反应式入站/出站WebSocket适配器,只需通过内部容器将会话与id关联,即可对消息进行一些处理,然后在出站时,它会检查消息标头中的会话id,并通过发送该会议。

现在,随着Spring通过org.springframework.web.reactive.socket.WebSocketSession和其他类提供响应式WebSocket支持,我想知道响应式WebSocket堆栈的通道适配器是否也有类似的支持。

如果没有,是否有任何通用的模式/做法,如何将响应式WS与spring-integration消息流进行集成?

2 个答案:

答案 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();
    }
}