我正在使用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在这里很有限。
我很惊讶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>
在这种情况下,在应用程序中配置SockJ可能会有很大的帮助:
<websocket:stomp-endpoint path="/cors/auth/clientEndpoint">
<websocket:handshake-handler ref="myHandshakeHandler" />
<websocket:sockjs/>
</websocket:stomp-endpoint>
这将给您:
如果您想要从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。但是,当我关闭会话工厂时,连接池不会自行关闭!这是我的应用程序中 唯一 可以进行会话操作的地方。 这是我的配置文件 请注意,空闲连接非常短的原因是它是我尚未通过集成测试的唯一方法。他们经常打开和关闭会话工厂,因此我总是用尽所有连接。正如我们在项目开始时一样,从长远来看,我认为这不是一个非常可持续的策略。 需要注意的“有趣