使用ReactorNettyWebSocketClient的示例

时间:2017-11-17 09:15:22

标签: spring-boot spring-websocket spring-webflux

New Spring在Spring documentation上有一些WebSocketClient示例。

WebSocketClient client = new ReactorNettyWebSocketClient();
client.execute("ws://localhost:8080/echo"), session -> {... }).blockMillis(5000);

但它很短而且不清楚:

  1. 如何向服务器发送消息(订阅频道)?
  2. 然后处理传入的流并发出Flux消息?
  3. 连接中断时重新连接服务器?
  4. 有人可以提供更复杂的例子吗?

    UPD。 我试着做类似的事情:

    public Flux<String> getStreaming() {
    
        WebSocketClient client = new ReactorNettyWebSocketClient();
        EmitterProcessor<String> output = EmitterProcessor.create();
        Flux<String> input = Flux.just("{ event: 'subscribe', channel: 'examplpe' }");
    
        Mono<Void> sessionMono = client.execute(URI.create("ws://api.example.com/"),
                session -> session
                        .send(input.map(session::textMessage))
                        .thenMany(session.receive().map(WebSocketMessage::getPayloadAsText).subscribeWith(output).then())
                        .then());
    
        return output.doOnSubscribe(s -> sessionMono.subscribe());
    }
    

    但是只返回一条消息。就像我没有订阅。

2 个答案:

答案 0 :(得分:4)

我假设你正在使用“echo”服务。为了从服务中获取一些消息,你必须将它们推入websocket,服务将“回显”它们给你。

在您的示例代码中,您只向websocket写入一个元素。一旦你将更多的消息推入套接字,你就会得到更多回复。

我调整了代码以连接到ws://echo.websocket.org而不是本地服务。当您浏览到/stream时,您会看到每隔一秒显示一条新消息。

@GetMapping(path = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> getStreaming() throws URISyntaxException {

    Flux<String> input = Flux.<String>generate(sink -> sink.next(String.format("{ message: 'got message', date: '%s' }", new Date())))
        .delayElements(Duration.ofSeconds(1));

    WebSocketClient client = new ReactorNettyWebSocketClient();
    EmitterProcessor<String> output = EmitterProcessor.create();

    Mono<Void> sessionMono = client.execute(URI.create("ws://echo.websocket.org"), session -> session.send(input.map(session::textMessage))
        .thenMany(session.receive().map(WebSocketMessage::getPayloadAsText).subscribeWith(output).then()).then());

    return output.doOnSubscribe(s -> sessionMono.subscribe());
}

希望这会有所帮助......

答案 1 :(得分:-1)

上面的文档链接是Spring Framework 5发行之前的临时文档。目前,关于实现WebSocketHandler的参考provides more information