2013-03-13 118 views
1

反正是有超時計劃任務(殺線程)在春季,如果任務需要長期甚至掛起,因爲遠程資源不可用殺春季調度線程

在我的情況下,任務可以花費太長的時間,甚至掛起是因爲它們基於HtmlUnitDriver(Selenium)步驟序列,但它會不時掛起,我希望能夠爲要執行的線程設置時間限制。最多1分鐘。

我設置5分鐘的固定費率執行,初始延遲1分鐘。

在此先感謝

+0

你解決這個問題? – Luciano 2013-03-15 13:47:38

回答

0

參見:How to timeout a thread

簡短的答案是,有沒有簡單的或可靠的方式來殺死一個線程由於Java的線程執行的限制。 ExecutorService#shutdown()是一種黑客和沉重。它最好在任務本身中處理這個問題,例如就像在網絡請求級別,如果您在套接字上發出REST請求超時。

或者,如果您執行某種類型的消息傳遞ala Actor模型(請參閱Akka),您可以發送一條來自「主管」的消息,以使Actor死亡。同時避免使用類似Netty的阻塞會有所幫助。

1

我也做了同樣前段時間下面這個例子:example

的基本思想是把你的代碼在一個類實現可贖回或可運行狀態,然後創建一個FutureTask無論你打算用給invoque你的線程Callable或Runnable類作爲參數。定義一個執行器,將你的FutureTask提交給執行器,現在你可以在try catch塊中執行x時間的線程,如果你的線程以一個timeoutException結束,你會知道它花了太長時間。

這裏是我的代碼:

CallableServiceExecutor callableServiceExecutor = new CallableServiceExecutor(); 
     FutureTask<> task = new FutureTask<>(callableServiceExecutor); 

     ExecutorService executor = Executors.newSingleThreadExecutor(); 
     executor.submit(task); 

     Boolean exito = true; 

     try { 

      result = task.get(getTimeoutValidacion() , TimeUnit.SECONDS); 

     } catch (InterruptedException e) { 
      exito = false; 
     } catch (ExecutionException e) { 
      exito = false; 
     } catch (TimeoutException e) { 
      exito = false; 
     } 

     task.cancel(true); 
     executor.shutdown(); 
+0

非常感謝Luciano,我會試一試並回復給您 – frandevel 2013-03-16 08:30:22

+0

這裏的一個重要區別是I0m使用Spring和@Async註釋,所以我沒有完全控制線程初始化並觸發 – frandevel 2013-03-16 14:15:53

+0

但儘管如此這給了我一個關於擁有主執行程序線程,手動運行所有子線程,可能在特定時間睡眠,然後殺死仍然活着的人的線索。保持控制是在這個ppoint – frandevel 2013-03-16 14:17:51