设置 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 的硬编码类名。
请帮忙。
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);
}
}
}
很高兴我看到这个页面!我们在发送 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。