如何在Spring 5 WebFlux WebSocket客户端中更改帧/缓冲区大小

3

当服务器发送大消息时,我的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,它会破坏缩进并使堆栈跟踪无法阅读。请使用代码格式化堆栈跟踪和错误消息。 - Jim Garrison
@JimGarrison 我明白了,感谢你指出来 :) - vindev
不用谢。你的其余编辑都很好。 - Jim Garrison
2个回答

0

可能有点晚了,希望能对你有所帮助。

根据这个合并请求,你应该将客户端设置为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();

0
自从spring-webflux:5.3版本起,@dazito的响应已被弃用。
请改用以下方式:
WebSocketClient client = new ReactorNettyWebSocketClient(HttpClient.create(),
    () -> WebsocketClientSpec.builder().maxFramePayloadLength(524288000))

源代码:javadoc(已弃用。 从5.3版本开始,建议使用带有构造函数参数的WebsocketClientSpec.Builder供应商)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接