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注解,同时确保配置了ServerEndpointExporterBean,让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
相关产品推荐
相关产品推荐

