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

Spring websocket在30分钟后自动关闭(超时)

万俟嘉珍
2023-03-14

我正在尝试使用Spring Boot(1.5.13)实现一个websocket

消息传递正常工作,但大约30分钟后,连接被服务器终止(原因1008-“此连接是在已结束的经过身份验证的HTTP会话下建立的”)。我尝试过设置不同的超时,但似乎没有任何效果。

@Service
@RequiredArgsConstructor
@Slf4j
public class OCPPSocketHandler extends TextWebSocketHandler {
    @Override
    public void handleTextMessage(WebSocketSession webSocketSession, TextMessage textMessage)
        throws IOException {
      ...
    }
}

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

    public static final String ENDPOINT = "/pp/v2.0";

    @Autowired
    private CustomSocketHandler socketHandler;

    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(
            new CustomExceptionWebSocketHandlerDecorator(socketHandler), ENDPOINT
        )
        .setAllowedOrigins("*");
    }
}
#6h as milliseconds
server.connection-timeout=3600000 
server.servlet.session.timeout=6h

我见过这个关于会话超时的问题,但我找不到解决方案

共有1个答案

翟源
2023-03-14

我发现我的WebSocket在30分钟后也关闭了。

根本原因是在SpringBoot中默认情况下http会话将在30分钟后关闭。

在SpringBoot中,config propertyserver.servlet.session.timeout将更改默认行为,但可能会有一些限制。

  1. 关闭连接的计时器在这里是io.undertow.server.session.InMemorySessionManager.sessionImpl
  2. 正如我们看到的io.undertow.server.session.InMemorySessionManager.sessionImpl#SetMaxInActiveInterval将重置计时器。
  3. 此方法将由javax.servlet.http.HttpSession#SetMaxInActiveInterval调用。
  4. 因此,一旦在每次超时之前调用SetMaxInActiveInterval,连接将永远不会关闭。

下面是我的实现:

  1. handshakeRequest存储到配置器javax.websocket.EndpointConfig#GetUserProperties中的javax.websocket.server.serverEndpointConfig.Configator#Modifyhandshake
  2. 我们的客户端将发送字符串消息以保持活动状态,因此在onmessage方法中,从javax.websocket.session#GetUserProperties中获取handshakeRequest,然后
HttpSession httpSession = (HttpSession) handshakeRequest.getHttpSession();
httpSession.setMaxInactiveInterval((int) (session.getMaxIdleTimeout() / 1000));

仅此而已,希望有帮助。

 类似资料:
  • 手撕环节:LeetCode原题 5分钟结束。 1.什么是链表(我例举了单链表和双向链表)。 2.尾插法,头插法(尾插忘了,就记了个头插入)。 3.HashMap(老八股了,从头溜到尾)。 4.HashMap线程安全吗? 为什么,会导致什么?(循环链表)。 5.为什么选用SpringBoot。 6.@Autowired和@Resource(面试官没读清,就听到了个@Resource) 7.Mysql

  • 问题内容: 我在服务器系统上工作,该系统不允许我存储超过50 GB的文件。我的应用程序需要20分钟才能生成文件。有什么方法可以将超过30分钟的所有文件从源移动到目标?我试过了: 但这不会从我的服务器中删除文件,因此存储限制失败。 其次,如果我使用该命令,仍在生成的文件也将移至目标文件夹,并且程序将失败。 问题答案: 您可以与此一起使用:- 根据需要替换并使用源路径和目标路径。 该命令的基本作用是,

  • 问题内容: 如果执行以下操作,文件句柄会在Python范围之外时自动关闭吗: 如果没有,如何编写此函数以自动关闭范围? 问题答案: 它应该关闭文件语句中的文件句柄,但是更好的方法是使用块: 有关更多信息,请参见http://docs.python.org/library/stdtypes.html#file.close。

  • 下面是我的配置: 但是,我在1分30秒后得到504网关超时错误。但不是根据我上面的配置,原因是什么?我怎么才能让它工作更多秒。

  • 所以我刚刚把我的Android Studio从3.0.1更新到了3.1。当我输入这个的时候,超过30分钟已经过去了,Android Studio被困在配置构建中。 我做了什么: 更改项目渐变文件中的渐变版本 我的项目build.gradle 这是我的申请build.gradle

  • 我想从9:30到12点每两分钟运行一次cron作业。我该怎么做? 这是正确的吗?我应该在哪里加30?