Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot 如何限制发送到Stomp队列(处理WebSocket)的数据量,以保证不会';缓冲区不会溢出吗?_Spring Boot_Websocket_Stomp_Throttling - Fatal编程技术网

Spring boot 如何限制发送到Stomp队列(处理WebSocket)的数据量,以保证不会';缓冲区不会溢出吗?

Spring boot 如何限制发送到Stomp队列(处理WebSocket)的数据量,以保证不会';缓冲区不会溢出吗?,spring-boot,websocket,stomp,throttling,Spring Boot,Websocket,Stomp,Throttling,我有两个Java进程,我正在spring boot中使用websocket连接它们。一个进程充当客户端,并按如下方式连接: List<Transport> transports = new ArrayList<Transport>(1); transports.add(new WebSocketTransport(new StandardWebSocketClient())); WebSocketClient client = new SockJs

我有两个Java进程,我正在spring boot中使用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);
在服务器端,我公开了一个控制器,我通过从工作线程调用端点来写入数据

@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文档,但没有找到任何方法。有没有其他明显的解决方案是我遗漏的


谢谢。

事实上我找到了一个解决方案,所以如果有人感兴趣,就在这里

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

所以我知道有多少输入,我在我的控制器类中跟踪,我知道有多少通过我安装的拦截器输出,这允许我始终保持在限制之下


在接受为代理排队的任何新邮件之前,控制器首先确定是否有足够的空间,如果没有,则在外部存储中排队等待邮件,直到有足够的空间。

您可以发布示例代码说明如何实现这一点吗?
@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);
}