项目版本:
gateway:3.0.2
springboot:2.4.6
背景:
对接阿里云tts,gateway转发websocket请求,在字节流超过65536时,连接自动断开,跟踪源码发现,WebsocketSpec限制了单次发送消息的最大字节数,目前还未找到动态配置的方法,如果有大神找到了欢迎告知
解决方案:
思路就是在项目启动完成后直接拿到ReactorNettyRequestUpgradeStrategy和ReactorNettyWebSocketClient,把里面的maxFramePayloadLength,也就是最大帧有效负载长度,通过反射改为想要的长度,代码:
```java
@Component
public class GatewayRunner implements ApplicationRunner, ApplicationContextAware {
@Value("${websocket.maxFramePayloadLength}")
private Integer maxFramePayloadLength;
private ApplicationContext applicationContext;
@Override
public void run(ApplicationArguments args) throws Exception {
Assert.notNull(maxFramePayloadLength, "maxFramePayloadLength Cannot be empty");
ReactorNettyRequestUpgradeStrategy bean = applicationContext.getBean(ReactorNettyRequestUpgradeStrategy.class);
Class<? extends ReactorNettyRequestUpgradeStrategy> aClass = bean.getClass();
Field field = aClass.getDeclaredField("maxFramePayloadLength");
field.setAccessible(true);
field.set(bean, maxFramePayloadLength);
ReactorNettyWebSocketClient bean1 = applicationContext.getBean(ReactorNettyWebSocketClient.class);
Class<? extends ReactorNettyWebSocketClient> aClass1 = bean1.getClass();
Field field1 = aClass1.getDeclaredField("maxFramePayloadLength");
field1.setAccessible(true);
field1.set(bean1, maxFramePayloadLength);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
}