我正在使用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消息机制。
此处的任务之一 - 实现websocket的服务器端关闭,以防在客户端超过10秒内没有ping消息。
使用Spring Websockets无法做到这一点!
也许有人可以告诉我如何访问用户的Session对象或通过Spring Websockets关闭这些Session?
看来Spring在这里非常有限。
答案 0 :(得分:4)
在这种情况下,在您的应用中配置SockJS可能会有很长的路要走:
<websocket:stomp-endpoint path="/cors/auth/clientEndpoint">
<websocket:handshake-handler ref="myHandshakeHandler" />
<websocket:sockjs/>
</websocket:stomp-endpoint>
这会给你:
如果您想实际关闭STOMP端点的会话,我建议您投票/关注the SPR-12288 JIRA issue。
答案 1 :(得分:3)
我很惊讶spring doc没有提到如何配置服务器ping ...看来spring希望我们阅读代码而不是阅读doc ..
经过一段时间在网上搜索和阅读源代码后,我意识到它已经得到了支持,但没有记录在一个引人注目的地方,比如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套接字会话超时,它应该大于ping间隔,如下所示:
<bean id="servletServerContainerFactoryBean" class="org.springframework.web.socket.server.standard.ServletServerContainerFactoryBean">
<property name="maxSessionIdleTimeout" value="30000"/>
</bean>
答案 2 :(得分:0)
要访问websocket会话,您可以使用以下方法: https://stackoverflow.com/a/32270216/2982835