2

我正在使用 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?

似乎春天在这里非常有限。

4

3 回答 3

5

我很惊讶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 套接字会话超时,它应该大于 ping 间隔,如下所示:

<bean id="servletServerContainerFactoryBean" class="org.springframework.web.socket.server.standard.ServletServerContainerFactoryBean">
    <property name="maxSessionIdleTimeout" value="30000"/>
</bean>
于 2016-10-18T08:34:58.937 回答
4

在这种情况下,在您的应用程序中配置 SockJS 可能会有很长的路要走:

<websocket:stomp-endpoint path="/cors/auth/clientEndpoint">
  <websocket:handshake-handler ref="myHandshakeHandler" />
  <websocket:sockjs/>
</websocket:stomp-endpoint>

这会给你:

如果您想真正从 STOMP 端点关闭会话,那么我建议您投票/关注SPR-12288 JIRA 问题

于 2014-10-01T08:38:17.617 回答
0

要访问 websocket 会话,您可以使用以下方法: https ://stackoverflow.com/a/32270216/2982835

于 2015-03-10T10:50:19.167 回答