我如何限制发送到Stomp队列(处理websocket)的数据量,以便可以保证不会溢出缓冲区?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我如何限制发送到Stomp队列(处理websocket)的数据量,以便可以保证不会溢出缓冲区?相关的知识,希望对你有一定的参考价值。

我有两个Java进程,我在春季启动时使用websocket连接它们。一个进程充当客户端并像这样连接:

    List<Transport> transports = new ArrayList<Transport>(1);
    transports.add(new WebSocketTransport(new StandardWebSocketClient()));
    WebSocketClient client = new SockJsClient(transports);

    WebSocketStompClient stompClient = new WebSocketStompClient(client);
    stompClient.setMessageConverter(new MappingJackson2MessageConverter());

    StompSessionHandler firstSessionHandler = new MyStompSessionHandler("Philip");
    stompClient.connect("ws://localhost:8080/chat", firstSessionHandler);

会话处理程序扩展了StompSessionHandlerAdapter并提供了这些方法(我正在通过用户名进行订阅,因此每个客户端都可以接收自己的消息):

@Override
public void afterConnected(
        StompSession session, StompHeaders connectedHeaders) 
    session.subscribe("/user/" + userName + "/reply", this);
    session.send("/app/chat", getSampleMessage());


@Override
public void handleFrame(StompHeaders headers, Object payload) 
    Message msg = (Message) payload;
    // etc.....

在服务器端,我暴露了一个控制器,并且正在通过从工作线程调用终结点来写数据。

@Autowired
private SimpMessagingTemplate template;

@MessageMapping("/chat")
public void send(
        Message message)
        throws Exception 

    template.convertAndSendToUser(message.getFrom(),
                             "/reply",
                                        message);

在websocket配置中,我重写了设置限制的方法:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer 
@Override
public void configureMessageBroker(MessageBrokerRegistry config) 
    config.enableSimpleBroker("/topic", "/user");
    config.setApplicationDestinationPrefixes("/app");


@Override
public void configureWebSocketTransport(WebSocketTransportRegistration registration) 
    registration.setMessageSizeLimit(500 * 1024);
    registration.setSendBufferSizeLimit(1024 * 1024);
    registration.setSendTimeLimit(20000);

我的问题是,如果服务器上的负载足够高并且我超出了限制,则websocket将会灾难性地失败,因此我想避免这种情况。我想做的是使控制器能够询问消息代理“此消息是否适合缓冲区?”,以便我可以限制在限制之下。我搜索了API文档,但看不到任何方法。我还有其他明显的解决方案吗?

谢谢。

答案

实际上我找到了一种解决方案,所以如果有人对此感兴趣,就在这里。

在websocket的服务器端配置上,我在出站通道(这是API的一部分)上安装了一个Interceptor,在从嵌入式代理每次发送之后都会调用它。

以上是关于我如何限制发送到Stomp队列(处理websocket)的数据量,以便可以保证不会溢出缓冲区?的主要内容,如果未能解决你的问题,请参考以下文章

使用队列的 C# STOMP 消息传递

我可以存储和读取来自 STOMP 队列/主题的消息吗?

使用持久队列 STOMP 向离线用户发送通知

如何将事务与 Stomp 和 ActiveMQ(和 Perl)一起使用?

使用Spring STOMP websockets向单个人发送消息

如果它在事务中,则发送帧失败 (STOMP)