You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WebSocket中@PostConstruct每次浏览器刷新都被调用是否正常?

问题分析与解决:@PostConstruct方法在WebSocket中重复执行

问题描述

我有一个标注@PostConstruct的方法,本应在WAS初始化时仅调用一次,但每次刷新浏览器时该方法都会被执行。该方法位于WebSocket组件中,使用的技术栈为Tomcat、Chrome、Spring和Node.js。

代码片段:

@Autowired
private WebPushDao temp;

private static WebPushDao service;

@PostConstruct     
private void WebPushDao() {service = temp;}

相同代码下,仅我的计算机出现该问题,同事电脑无异常。已重新克隆源码、更换新Tomcat,问题仍存在。

可能的原因及排查方向

1. WebSocket端点实例化策略错误

如果WebSocket端点未被Spring正确管理,Tomcat会在每次建立新WebSocket连接时创建端点类的新实例,导致@PostConstruct重复执行。

  • 检查端点类是否添加@Component注解,同时确保配置了ServerEndpointExporter Bean,让Spring接管端点实例化:
    @Component
    @ServerEndpoint("/your-websocket-path")
    public class YourWebSocketEndpoint {
        // 原有代码
    }
    
    配置类中添加:
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
    
  • 注意:@PostConstruct方法建议使用public/protected修饰,避免私有方法可能引发的Spring管理异常。

2. Chrome浏览器特殊设置影响

  • 输入chrome://flags/搜索Persistent WebSockets,尝试禁用该选项后测试。
  • 清除浏览器缓存(Ctrl+Shift+Delete),重点清除WebSocket连接相关缓存数据,再重新测试。
  • 换用Firefox等其他浏览器测试,排除Chrome专属问题。

3. 本地Tomcat配置差异

  • 检查Tomcat的context.xml,确认<Context>标签的reloadable属性是否为true,开启该属性会导致Tomcat频繁重载上下文,触发Bean重新初始化。
  • 检查server.xml中的autoDeploy属性,若设为true可能导致应用频繁重启。

4. 本地Node.js服务干扰

  • 查看Node.js服务日志,确认是否存在频繁调用Spring接口、触发应用上下文重载的情况。
  • 暂时关闭Node.js服务,单独测试Spring的WebSocket功能,验证问题是否消失。

5. IDE运行配置问题

  • 检查IDE(如IntelliJ IDEA/Eclipse)的运行配置,是否启动了多个应用实例,或开启了自动重启功能(如Spring DevTools)。
  • 若使用Spring DevTools,确认spring.devtools.restart.enabled是否设为true,该功能会在文件变化时自动重启应用。

内容的提问来源于stack exchange,提问作者unyo66

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 22:12:16