说明:resin 用的版本是4.0的
由于需要程序运行时产生一条线程,对特定数据进行处理;
一直以来都运行得很正常,除了程序因为BUG太多缘故,运行一段时间后就会报内存溢出错误,
一直没找到真正原因,因此,经常得过段时间就要重启resin
某天突然发现数据被重复处理了,生成了重复的记录,时间点完全一样;
因为这些数据在处理时会进行排重处理
因此,按照程序的正常处理逻辑是不可能有重复数据的,并且时间点是一样的,
检查了很多遍相关代码就是看不出哪里会出问题
重启resin后,这种现象就又没有了,有段时间,重复数据特别多,
可能隔1,2天就又会出现这种情况,进行代码调试也调试不出有这种情况
最后通过跟踪resin处理日志和程序日志,发现当出现这种情况时,数据被重复生成了,
相关日志信息都打印了二次,就好像这个线程突然会分身术变成了二个一模一样的线程了;
但是又想不出是什么情况下才会让线程突然分身成2条。
在网上找了很久资料,都没找到有人说有这种情况;
后来无意间看到一张贴子,说的是resin覆盖class的时候,会重新读web.xml
而我的线程是放在容器的ini方法里产生的。
public class ContainerListen implements ServletContextListener {
public void contextDestroyed(ServletContextEvent sce) {
}
public void contextInitialized(ServletContextEvent sce) {
//开启 实时线程
new SSThread();
}}
对照产生重复记录的日期,发现产生重复记录时我都有修改程序,因为知道resin会自动加载修改的类,
所以修改类传到服务器时都没有重启resin,悬了几个月的问题终于解决了。哎!
参考:http://topic.youkuaiyun.com/t/20040628/13/3128123.html /blockquote