我正在尝试使用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
对此有些迷茫和陌生,所以请引导我。
答案 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();
});
}