如何在 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 应用程序