天天看點

程式在resin中運作時産生意外多條線程

說明: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.csdn.net/t/20040628/13/3128123.html

/blockquote

繼續閱讀