2013-02-04 53 views
1

我們在應用程序中使用Websphere Work Manager(CommonJ)來產生線程。我們正在使用默認的WorkManager,並通過JNDI在我們的應用程序中訪問它。應用程序線程繼續運行

try { 
    Context ctx = new InitialContext(); 
    wm = (WorkManager) ctx.lookup("java:comp/env/wm/App_WORKMANAGER"); 
    wm.schedule(this); 
    //threadScheduler = new Thread(this); 
    //threadScheduler.start(); 
} catch (Exception e) { 
    // catch the exception 
} 

我們繼續運行偵聽不同隊列的線程來檢查任何消息並對其進行處理。我們確實收到了如下所示的消息,並知道可以從管理控制檯配置該消息以停止顯示警告/錯誤或增加掛起檢測時間。

[13年1月30日6:50:38:708 EST] 00000032 ThreadMonitorW¯¯WSVR0605W:線程 「WorkManager.DefaultWorkManager:2」(00000022)已活躍708969毫秒,並且可被掛起。總共有1個線程可以掛在服務器上。

現在,如果我們停止從管理控制檯的應用程序,這些線程不會停止,我們不斷收到洪消息。對於另一個部署,另一組線程合計爲洪線程數。 我在某處讀到,如果我們將線程聲明爲Daemon,那麼它們會停止()。那麼,我們宣佈線程爲Daemon如下,或者我們需要重寫release()方法嗎?我們的release()目前爲空。

public boolean isDaemon() {       
    return true; 
} 

public void release() { 
//TODO 
} 

我們究竟應該如何阻止應用程序線程停止運行?這是一個使用Struts 1.x的舊應用程序。

我看了兩種這裏解釋:

  1. Thread keeps running even after application has been stopped in Websphere(因爲我沒有使用彈簧,剛剛宣佈Deamon是很好,如果我們停止JVM本身這會工作,只是從控制檯停止應用程序不會?幫助,對不對?)

  2. Does Websphere respect Daemon threads?(由Sarel博塔建議的方法是唯一的解決方案或我們從控制檯一些設置來完成這項工作。)

謝謝。

+0

您將不得不爲應用程序創建一個啓動/關閉偵聽器,並停止線程 –

+0

感謝Aviram,我將嘗試使用servlet上下文偵聽器。雖然它會有點繁瑣,因爲應用程序沒有共同的服務創建theads ..將不得不挖掘到每個線程.. :) – pranav

回答

0

是的,在您的使用情況isDaemon方法應該返回true,你需要實現release方法,它停在Work對象的run方法執行的代碼的方式。如果您這樣做,則掛起的線程警告消失,並且WebSphere將在應用程序停止時在所有正在運行的Work對象上調用release

+0

謝謝安德烈亞斯..我已經寫了一個contex監聽器,並把我所有線程引用爲null。仍然需要檢查它有多遠。是的,我已經宣佈這個Threds爲Daemon,並且看起來像是壓制了懸掛線程的警告。在run方法中,我們一直在尋找隊列,所以我不能在釋放時做太多的事情。所以保持我的賭注把refrences爲空。 – pranav

+0

安德烈亞斯把參考作爲null不會工作..實施釋放()的想法做了伎倆..感謝幫助.. – pranav