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

问题描述 投票:0回答:2

设置 org.apache.tomcat.websocket.BLOCKING_SEND_TIMEOUT 以增加 tomcat websocket 超时的预期方法是什么? Tomcat 文档说明如下:

这可以通过设置属性来更改 用户中的 org.apache.tomcat.websocket.BLOCKING_SEND_TIMEOUT 附加到 WebSocket 会话的属性集合。

我在 TextWebSocketHandler 的 afterConnectionEstablished 方法中看到的 WebSocketSession 似乎没有用户属性。所以,我认为这不是文档的意思。在查看 TomcatRequestUpgradeStrategy 时,在我看来,它从不查看端点用户属性。在我看来,您也不能覆盖 TomcatRequestUpgradeStrategy,因为 AbstractHandshakeHandler 有一个 TomcatRequestUpgradeStrategy 的硬编码类名。

请帮忙。

java spring-boot tomcat websocket
2个回答
1
投票

org.apache.tomcat.websocket.BLOCKING_SEND_TIMEOUT
是您需要在 WebSocket API 的
Session
上设置的用户属性,而不是此接口的 Spring 抽象。

您可以在

afterConnectionEstablished
方法中配置它,方法是将 Spring
WebSocketSession
转换为
NativeWebSocketSession
并检索底层 WebSocket API 会话:

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);
        }
    }
}

0
投票

很高兴我看到这个页面!我们在发送 1000 条消息的负载测试中遇到了问题,但只收到了大约一半的消息,而且事实证明很难找到原因。尽管发布的解决方案不太正确,至少对于我们的代码库来说是这样,但它为我指明了正确的方向。 作为参考,我必须按照上面的建议对

SubProtocolWebSocketHandler
进行子类化并重写
afterConnectionEstablished()
方法,但是
Session
StandardWebSocketSession
而不是
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);
    }

然后,在指定了

@Configuration
的相关
@EnableWebSocketMessageBroker
类中,提供
@Bean
@Primary
方法来创建它的实例,该方法会覆盖默认的
SubProtocolWebSocketHandler
bean。

© www.soinside.com 2019 - 2024. All rights reserved.