我正在使用 Spring 4 + Websockets + Stomp JS 库。 我找不到任何方法来设置 websocket ping/pong 机制(心跳)。
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<beans xmlns="http://www.springframework.org/schema/beans" ...">
<websocket:message-broker>
<websocket:stomp-endpoint path="/cors/auth/clientEndpoint">
<websocket:handshake-handler ref="myHandshakeHandler" />
</websocket:stomp-endpoint>
<websocket:simple-broker prefix="/queue, /topic" />
<websocket:client-inbound-channel>
<websocket:interceptors>
<bean class="com.mycompany.myproject.utils.messaging.MyInboundChannelInterception"></bean>
</websocket:interceptors>
</websocket:client-inbound-channel>
</websocket:message-broker>
<bean id="myHandshakeHandler" class="com.mycompany.myproject.utils.security.MyHandshakeHandler" />
<bean class="org.springframework.web.socket.server.standard.ServletServerContainerFactoryBean">
<property name="maxSessionIdleTimeout" value="120000" />
</bean>
因此,我正在实现我自己的 ping/pong 消息机制。
此处的任务之一 - 在超过 10 秒的时间内没有来自客户端的 ping 消息时,实现服务器端关闭 websocket。
并且没有办法使用 Spring Websockets 来做到这一点!
也许有人可以告诉我如何访问用户的 Session 对象或通过 Spring Websockets 关闭那些 Session?
似乎这里的 Spring 非常有限。
最佳答案
我很惊讶 spring doc 没有提到如何配置服务器 ping...似乎 spring 希望我们阅读代码而不是阅读文档..
在网上搜索和阅读源代码一段时间后,我意识到它已经被支持,但没有在像 spring websocket doc 这样引人注目的地方记录下来。
我正在使用 spring 4.3.3,这里是如何在不使用 sockJS 的情况下配置服务器 ping:
@Configuration
@EnableWebSocketMessageBroker
public class StompOverWebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws").setAllowedOrigins("*");
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.setApplicationDestinationPrefixes("/app");
ThreadPoolTaskScheduler pingScheduler = new ThreadPoolTaskScheduler();
pingScheduler.initialize();
registry.enableSimpleBroker("/topic")
.setHeartbeatValue(new long[]{20000, 0}).setTaskScheduler(pingScheduler);
}
....
}
并且应该确保您正确设置了 web 套接字 session 超时,它应该大于 ping 间隔,如下所示:
<bean id="servletServerContainerFactoryBean" class="org.springframework.web.socket.server.standard.ServletServerContainerFactoryBean">
<property name="maxSessionIdleTimeout" value="30000"/>
</bean>
关于java - Spring 4 + Websockets : how to close the session?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26118043/