如何在 Spring 5 webflux websocket 客户端上更改帧/缓冲区大小

Posted

技术标签:

【中文标题】如何在 Spring 5 webflux websocket 客户端上更改帧/缓冲区大小【英文标题】:How to change the frame/buffer size on a Spring 5 webflux websocket client 【发布时间】:2018-01-30 05:51:39 【问题描述】:

当服务器发送大消息时,我的 Spring 5 webflux websocket 客户端抛出异常。 谁能告诉我如何增加客户端的帧大小?

Flux<String> input = Flux.just(StrJSON);

WebSocketClient client = new ReactorNettyWebSocketClient();
client.execute(new URI(url),
      session ->  session
                  .send(input.map(session::textMessage))
                  .thenMany(
                      session.receive()
                            .map(t->t.getPayloadAsText())

                            .log()
                    )
                    .then()          
        ).block();

间歇性异常:

io.netty.handler.codec.CorruptedFrameException: Max frame length of 65536 has been exceeded.    
    at io.netty.handler.codec.http.websocketx.WebSocket08FrameDecoder.protocolViolation(WebSocket08FrameDecoder.java:412)
    at io.netty.handler.codec.http.websocketx.WebSocket08FrameDecoder.decode(WebSocket08FrameDecoder.java:277)
    at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:489)
 .....

【问题讨论】:

@vindev 请不要使用 blockquote 进行堆栈跟踪,它会弄乱缩进并使堆栈跟踪不可读。对堆栈跟踪和错误消息使用代码格式。 @JimGarrison 知道了,谢谢指出:) 不客气。您的其余编辑都很好。 【参考方案1】:

帮助你可能有点晚了。

根据这个merge request,你应该将你的客户端设置为ReactorNettyWebSocketClient而不是接口WebSocketClient

那你可以拨打client.setMaxFramePayloadLength(maxFramePayload);

所以在你的代码中你应该有:

ReactorNettyWebSocketClient client = new ReactorNettyWebSocketClient();
client.setMaxFramePayloadLength(2097152);

client.execute(new URI(url),
      session ->  session
                  .send(input.map(session::textMessage))
                  .thenMany(
                      session.receive()
                            .map(t->t.getPayloadAsText())

                            .log()
                    )
                    .then()          
        ).block();

【讨论】:

以上是关于如何在 Spring 5 webflux websocket 客户端上更改帧/缓冲区大小的主要内容,如果未能解决你的问题,请参考以下文章

[转] 使用 Spring 5 的 WebFlux 开发反应式 Web 应用

每日阅读2020年7月14日-使用 Spring 5 的 WebFlux 开发反应式 Web 应用

传统的Spring Web MVC如何像WebFlux一样异步处理请求?

Spring WebFlux 教程:如何构建反应式 Web 应用程序

如何在 Spring Webflux / Reactor Netty Web 应用程序中执行阻塞调用

新一代Spring Web框架WebFlux!