首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring WebSocketMessageBroker -不能发送超过64 via的消息,也不能通过配置增加限制。

Spring WebSocketMessageBroker -不能发送超过64 via的消息,也不能通过配置增加限制。
EN

Stack Overflow用户
提问于 2022-08-08 13:49:44
回答 1查看 115关注 0票数 2

我有一个应用程序,前端在React中,后端在Java & Spring。

前端通过websockets订阅许多主题,除了消息太长之外,它总是很好。结果是,当websocket消息超过64 no时,将不会发送消息,但不会报告错误。此外,即使消息是短的,随后在该连接上发送更多消息的任何尝试也将失败。

在后端,我们首先配置websocket.我尝试了其他建议,比如增加尺寸限制:herehere,但都没有效果。这些值似乎完全被忽略了,就好像我设置了一个非常低的值,更长的消息仍然可以通过(如果小于64K)。

代码语言:javascript
复制
@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端点,就可以触发通知。

代码语言:javascript
复制
@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();
    }
}

以及前端的示例代码:

代码语言:javascript
复制
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,则不会接收消息,任何进一步的调用都无法工作(但对于任何新订阅都可以)。最糟糕的是,没有任何类型的日志报告问题。

我已经寻找了几天的替代方案,但没有找到任何答案。

有什么想法吗?为什么我配置的值不能工作?也许有另一种方法来设置大小限制?

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-10 12:09:28

我没有意识到,我使用的是“网关”组件,默认情况下,最大有效负载被配置为64K。通过设置类似于this answer的属性,我能够修复这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73278967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档