java - Spring 4 + Websockets : how to close the session?

标签 java spring stomp spring-websocket

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

相关文章:

spring - 构建后如何将用户添加到 inMemoryAuthentication 构建器?

java - 如何在 Spring 3 中将 View 中表单中的对象列表绑定(bind)到 Controller

Java 生产者、Stompy Python 消费者、ActiveMQ

java - <T extends A> void foo(T t) 和 void foo(A a) 的区别

java - 使用 SWIG 生成 Java 接口(interface)

java - 无法将值插入数据库

java - 通过 Websocket Controller 打印从 Stomp 传入的 json 数组

java - 短路 AND、OR 和优先级表

java - 在部署 tomcat 时挂起并给出异常

php - 将 PHP 与 Orbited 连接起来