如何设置org.apache.tomcat.WebSocket.BLOCKING_SEND_TIMEOUT?

pkbketx9  于 12个月前  发布在  Apache
关注(0)|答案(2)|浏览(212)

设置org.apache.tomcat.WebSocket.BLOCKING_SEND_TIMEOUT以增加tomcat websocket超时的预期方法是什么?Tomcat文档陈述了以下内容:
可以通过设置附加到WebSocket会话的用户属性集合中的属性org.apache.tomcat.websocket.BLOCKING_SEND_TIMEOUT来更改此设置。
我在TextWebSocketHandler的afterConnectionEstablished方法中看到的WebSocketSession似乎没有用户属性。因此,我认为这不是文档的含义。在查看TomcatRequestUpgradeStrategy时,在我看来,它从来不查看端点用户属性。在我看来,您也不能覆盖TomcatRequestUpgradeStrategy,因为AbstractHandshakeHandler具有用于Tomcat请求升级策略。
请帮帮我

uqcuzwp8

uqcuzwp81#

org.apache.tomcat.websocket.BLOCKING_SEND_TIMEOUT是您需要在WebSocket API的Session上设置的用户属性,而不是此接口的Spring抽象。
您可以通过将Spring WebSocketSession强制转换为NativeWebSocketSession并检索底层WebSocket API会话来在afterConnectionEstablished方法中配置它:

public void afterConnectionEstablished(WebSocketSession session) throws Exception {
    if (session instanceof NativeWebSocketSession) {
        final Session nativeSession = ((NativeWebSocketSession) session).getNativeSession(Session.class);
        if (nativeSession != null) {
            nativeSession.getUserProperties()
                         .put("org.apache.tomcat.websocket.BLOCKING_SEND_TIMEOUT", 60_000L);
        }
    }
}

字符串

mjqavswn

mjqavswn2#

很高兴我看到这个页面!我们遇到了负载测试发送1000多条消息的问题,只有大约一半的消息被接收到,并且很难追踪原因。尽管发布的解决方案不太正确,至少对于我们的代码库来说,它为我指出了正确的方向。作为参考,我必须子类化SubProtocolWebSocketHandler并覆盖上面建议的afterConnectionEstablished()方法,但SessionStandardWebSocketSession而不是NativeWebSocketSession

@Override
    public void afterConnectionEstablished(final WebSocketSession session) throws Exception {
        final Session nativeSession = ((StandardWebSocketSession) session).getNativeSession(Session.class);
        nativeSession.getUserProperties()
            .put("org.apache.tomcat.websocket.BLOCKING_SEND_TIMEOUT", CUSTOM_BLOCKING_SEND_TIMEOUT);
        super.afterConnectionEstablished(session);
    }

字符串
然后,在指定了@EnableWebSocketMessageBroker的相关@Configuration类中,提供@Bean@Primary方法来创建它的示例,该方法覆盖默认的SubProtocolWebSocketHandler bean。

相关问题