反应式WebSocketClient数据发布

时间:2019-03-28 23:58:22

标签: java spring-webflux project-reactor reactor-netty

我正在尝试使用ReactorNettyWebSocketClient从websocket读取数据,但是我无法连接到它的api。问题是我收到的所有数据都可以在lambda样式的websockethandler(#1)的内部使用,但是我想在.subscribe上的client.execute(..)(#2)之后将其提供给订阅者使用/ p>

WebSocketClient client = new ReactorNettyWebSocketClient();
        client.execute(
                URI.create(URL),
                session -> session.send(
                        Mono.just(session.textMessage(pairRqStr)))
                        .thenMany(session.receive()
                                .map(WebSocketMessage::getPayloadAsText)
                                .map(this::toResp)
                                .onErrorContinue((throwable, o) -> throwable.getMessage())
                        )
                        .log() // #1
                        .then()
        )
                .log()
                .subscribe(System.out::println); // #2

对此有些迷茫和陌生,所以请引导我。

2 个答案:

答案 0 :(得分:0)

要发送或接收消息,必须首先连接到该频道。这就是client.execute返回Mono<Void>的原因,这意味着它不返回任何数据,仅表示handkahe完成或失败。 如果它将返回例如。 Flux<WebSocketMessage>,您如何知道握手是否成功完成?

如果要访问lambda之外的通道,则无法通过实现处理程序方法来做到这一点:

        Consumer<WebSocketMessage> printingConsumer = webSocketMessage -> System.out.println(webSocketMessage.getPayloadAsText());

        client.execute(URI.create(URL), session -> handle(session, printingConsumer));
    }


    public Mono<Void> handle(WebSocketSession session, Consumer<WebSocketMessage> consumer) {
        return session.receive()
                .doOnNext(consumer::accept)
                .then();
    }

答案 1 :(得分:0)

这是我最后做的,但还是不太喜欢:

    private Flux<WebSocketMessage> requestData(String req) {
        WebSocketClient client = new ReactorNettyWebSocketClient();
        return ConnectableFlux.create(sub -> {
            client.execute(
                    URI.create(URL),
                    session -> session.send(
                            Mono.just(session.textMessage(req)))
                            .thenMany(session.receive().doOnNext(sub::next))
                            .then()
            )
                    .log()
                    .subscribe();
        });
    }