问题描述:

项目是使用springboot2开发,打的war包,以docker的形式部署到tomcat运行,我项目有一个@Scheduled 定时器,每天定时处理生产数据,处理完后定时发送邮件,但是遇到的问题是,每次接收邮件会同时连着接到两封相同的邮件,也就是说同一个事件在同一时刻被触发了两次。一开始我以为是网络原因,没有重视,直到昨天我们领导找我说这个项目中的邮件组里面把CTO和新来的技术总监加进去,并反馈了这个问题,他要求这个bug必须要快速解决,而且要尽快修复上线。


原因分析:

好吧,既然是bug,那得及时解决修复啊,哎,搞的中午午觉都没有了😋,言归正传, 我在本地调试时,按照同样的方法配置, @Scheduled 配置的定时任务,在触发时只会被执行一次。而部署到服务器上的 tomcat 后,就会被触发两次。 仔细检查代码,验证代码没有问题,怀疑跟服务器有关。查看服务器上的 ${your_tomcat_path}/conf/server.xml 文件, 同时配置了 appBase=“webapps” 和 docBase=“YourApp”,而我的应用是放置在 webapps/YourApp下面的。 这样配置后,相当于在 tomcat 启动时加载了两个应用。所以会出现定时任务被执行两次,而定时任务执行时,对象内的状态是不一样的。

解决方案:

既然知道了根源,那就容易解决了,解决方案有两种:

方案1:修改 ${your_tomcat_path}/conf/server.xml 文件,将 appBase 设置为 appBase=“”,相当于将 appBase 设置为空;并且将 docBase 设置为 docBase=“webapps/YourApp”;

方案2:修改 ${your_tomcat_path}/conf/server.xml 文件,appBase 不变,将 docBase 所在的 Contex 节点去掉(注释掉)。

我采用的是方案2,因为采用方案1的话,项目已经对外提供的接口路径就会发生改变,会导致你的上游也会跟着变,这不可取,所以采用方案2。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐