我有一个应用程序,前端在React中,后端在Java & Spring。
前端通过websockets订阅许多主题,除了消息太长之外,它总是很好。结果是,当websocket消息超过64 no时,将不会发送消息,但不会报告错误。此外,即使消息是短的,随后在该连接上发送更多消息的任何尝试也将失败。
在后端,我们首先配置websocket.我尝试了其他建议,比如增加尺寸限制:here和here,但都没有效果。这些值似乎完全被忽略了,就好像我设置了一个非常低的值,更长的消息仍然可以通过(如果小于64K)。
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config)
{
config.enableSimpleBroker("/ws");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry)
{
registry.addEndpoint("/ws").setAllowedOriginPatterns("*").withSockJS();
}
@Override
public void configureWebSocketTransport(WebSocketTransportRegistration registry)
{
registry.setMessageSizeLimit(1000000);
registry.setSendBufferSizeLimit(1000000);
registry.setSendTimeLimit(100000);
}
}下面是一个发送websocket消息的简化示例,我已经测试了这些消息,并且仍然存在相同的问题。只需从应用程序调用HTTP端点,就可以触发通知。
@RestController
@RequestMapping("/greeting")
public class GreetingController {
@Autowired
private SimpMessagingTemplate messageTemplate;
@GetMapping("/{length}")
public ResponseEntity<?> sendGreeting(@PathVariable int length)
{
String destination = "/ws/subscribedGreeting";
char[] charArray = new char[length];
Arrays.fill(charArray, '*');
String messageString = new String(charArray);
messageTemplate.convertAndSend(destination, messageString);
return ResponseEntity.noContent().build();
}
}以及前端的示例代码:
import SockJS from 'sockjs-client';
import Stomp from 'stomp-websocket';
...
useEffect(() => {
const sock = new SockJS('my-ws-url'); // replace depending on your environment
const stompClient = Stomp.over(sock);
stompClient.connect({}, () => {
stompClient.subscribe('/ws/subscribedGreeting', (messageFromSocket) => {
console.log(`Message! ${messageFromSocket.body.length}`);
});
});
}, []);最后,调用/greeting/{length}端点。我刚和邮递员一起做了快速测试。
如果我使用低长度值( /greeting/100、/greeting/10000、/greeting/60000 )调用,则工作正常(日志用于控制台长度),但如果设置了greeting/70000,则不会接收消息,任何进一步的调用都无法工作(但对于任何新订阅都可以)。最糟糕的是,没有任何类型的日志报告问题。
我已经寻找了几天的替代方案,但没有找到任何答案。
有什么想法吗?为什么我配置的值不能工作?也许有另一种方法来设置大小限制?
提前谢谢。
发布于 2022-08-10 12:09:28
我没有意识到,我使用的是“网关”组件,默认情况下,最大有效负载被配置为64K。通过设置类似于this answer的属性,我能够修复这个问题。
https://stackoverflow.com/questions/73278967
复制相似问题