当前位置: 首页 > 知识库问答 >
问题:

spring 4+WebSockets:如何关闭会话?

柏夕
2023-03-14

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

null

因此,我正在实现自己的乒乓消息机制。

这里的任务之一-实现服务器端关闭websocket,以防在超过10秒的时间内没有来自客户端的ping消息。

使用spring WebSockets是没有办法做到这一点的!

也许有人能告诉我如何通过spring WebSockets访问用户的Session对象或关闭这些会话?

看来spring在这里很有限。

共有2个答案

贡念
2023-03-14

我很惊讶spring doc没有提到如何配置服务器ping...看来spring期望我们读代码而不是读doc。

经过一段时间的网上搜索和阅读源代码,我意识到它已经被支持,但不像spring websocket文档那样在一个明显的地方记录。

我使用的是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>
哈涵容
2023-03-14

在这种情况下,在应用程序中配置SockJ可能会有很大的帮助:

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

这将给您:

  • 更好的HTTP客户端支持
  • 心跳管理

如果您想要从STOMP端点关闭会话,那么我建议您投票/遵循SPR-12288 JIRA问题。

 类似资料:
  • 问题内容: 遵循我们在如何在MySQL中关闭sqlalchemy连接中的注释之后,我正在检查SQLAlchemy创建到数据库中的连接,如果不退出Python,我将无法关闭它们。 如果我在python控制台中运行此代码,它将保持会话打开状态,直到我退出python为止: 我发现要关闭它的唯一解决方法是在最后调用。 根据我上面给出的链接中的评论,我的问题现在是: 为什么需要关闭会议? 还不够吗 问题答

  • 我正在使用ActiveMQ对电子邮件进行排队,消费者读取队列并发送电子邮件。 在启动时,我注册一个生产者,并永远缓存它。 有时,当连接关闭时,生产者无法将消息加入队列。 有人能告诉我处理闭门会议的最佳方式吗?我应该重新注册我的制作人吗?还是有办法重开会话?

  • 问题内容: 建立与服务器的连接,并显示连接打开的警报!但是之后,连接立即关闭。服务器没有调用close,并且控制台中似乎没有其他错误。chrome和firefox中都在发生这种情况。 我在网上看了一堆不同的类似示例,但都无济于事。 问题答案: 解决它! 我要做的就是在websocket连接关闭之前阻止处理程序返回

  • 我使用hibernate并尝试优化加载带注释的外部实体 我不想在hibernate查询期间检索外部实体并使用延迟获取类型。稍后(会话已经关闭之后),我想获取那个外部实体,但使用的工具不同于hibernate(另一个缓存的DAO(GuavaCache),它已经存储了外部实体)。 当然,我立即得到了一个LazyLaunalizationException。 我不能用@Transient替换@ManyT

  • 我有下面的方法,每隔几秒钟插入一大批记录。运行一段时间后,我得到如下错误: 错误:通信链接失败 从服务器成功接收的最后一个数据包是523毫秒前。上次成功发送到服务器的数据包是8毫秒前。 May 16, 2013 9:48:30 AM com.mchange.v2.c3p0.stmt.GooGooStatementCache checkinStatement INFO: 签入语句问题,丢弃。 com

  • 问题内容: 我最近开始在应用程序中使用hibernate和c3p0作为ORM。但是,当我关闭会话工厂时,连接池不会自行关闭!这是我的应用程序中 唯一 可以进行会话操作的地方。 这是我的配置文件 请注意,空闲连接非常短的原因是它是我尚未通过集成测试的唯一方法。他们经常打开和关闭会话工厂,因此我总是用尽所有连接。正如我们在项目开始时一样,从长远来看,我认为这不是一个非常可持续的策略。 需要注意的“有趣