Resin热部署之静态资源注意事项: 一不注意就踩雷!

来源:互联网 发布:dm500刷机软件 编辑:程序博客网 时间:2024/06/08 08:25

1、前言

公司有个统计系统,前段时间修改了一个Java文件后,直接将编译后的class文件替换到服务器上,替换完之后,发现统计的数据Double了,即本来有一条数据,统计系统跑出来的结果却是有两条一模一样的数据。

发现问题后,立即查看系统日志,发现日志中没有打印类似Exception、Error等信息,但从日志中能看出,确实是统计任务执行了两遍。

将resin服务器 stop 然后再 start后, 统计程序恢复正常!

2、问题查找

其它问题的排查过程略过。

当其它可能性都排除后,我发现统计系统的任务都放在一个静态list列表中:
private static List<BusinessTaskConfig> tasks = new ArrayList<BusinessTaskConfig>();
再由任务管理分发类,对列表中的任务进行分发执行。

会不会是list中任务列表的任务重复了,所以才会执行两遍?想到我就去运行程序试了下,最后发现确实是resin在热部署时,原先的静态资源没有释放,最终造成了会有两份统计任务一起执行的事情发生。

3、代码示例

下边我用一段简单的代码,模拟一下这种情况的发生。

第一步: 启动项目

这里写图片描述

第二步:稍微修改一下代码,重新编译,此时resin会重新加载项目

这里写图片描述

第三步:对比第一步图片和第二步图片,发现第一步图片中list存放的时间戳1484301020479在第二步图片中依然存在,并且第二步的图片中又多了一个新的时间戳。

4、结论

这种静态资源不释放的情况,并不一定就会带来问题,但是在一些特殊的情况下(如我们的统计系统,将统计任务放到静态资源中进行管理),就会造成严重的后果。

在这里将问题记录一下,希望能帮助到大家,也希望自己以后能尽量避免这种问题的发生。

对于此统计系统,替换文件时,先将resin stop,替换完后,再start,这样就不会出现问题了。

0 0
原创粉丝点击