2016-01-05 20 views
0

我想在春季啓動應用程序使用Java ExecutorService。應用程序的 多個模塊被稱爲@Scheduled。 此模塊調用過程從使用Runtime.exec外部應用程序獲得的結果。該方法應該得到這是由java的的ExecutorService爲的Runtime.exec春季引導正確的方式

此方法處理可以稱爲一個請求和響應,其可以被稱爲24/7的調度的線程的一部分以及部分結果。該方法的多個實例可以一次運行。

它是最佳使用被定義爲這樣一個或局部變量一些其它方法ExecutorService建議。 要求是Java不應該無限等待得到結果。它應該超時。 這裏是叫

public String getExternalInformation(String applicationPath, String command, int noOfTries) 
{ 


    ExecutorService executor = Executors.newSingleThreadExecutor(); 
    Future<String> future; 
    boolean taskExecuted=false; 
    int trialNumber=0; 
    String response = ""; 
    while((!taskExecuted)&&(trialNumber<noOfTries)) 
    { 
     trialNumber++; 
     log.info("Starting Trial: "+trialNumber); 
     future= executor.submit(new TestProcessTask(applicationPath,command)); 

     try { 
       System.out.println("Started Information Fetching "); 

      response=future.get(3, TimeUnit.MINUTES); 
      taskExecuted =true; 

      } catch (TimeoutException e) { 
      future.cancel(true); 

       System.out.println("Timed out!"); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 

      e.printStackTrace(); 
     } catch (ExecutionException e) { 

      e.printStackTrace(); 
     } 
    } 

    executor.shutdownNow(); 
    return response; 
} 

的TestProcessTask的call()方法將調用Runtime.exec和解析返回OutputStream的方法。

+0

我可能會使用配置'TaskExecutor',而不是(從創建和管理爲您節省了春天'ExecutorService',你有一個你可以配置的共享實例)。也有一些重試邏輯在裏面,你可能想看看重試行爲春重試項目爲(由Spring Batch的和Spring集成使用)。 –

+0

已經使用TaskExecutor運行@Scheduled作業。這是預定的工作,然後調用這個方法來運行一個進程。 – javaEd

+0

上述方法是否會導致內存開銷或資源中的任何問題?由於它是一個局部變量,我認爲它是安全的。我正在做這個作爲應用程序的快速修復。如果它可能導致任何問題,我想確定它。 – javaEd

回答

1

我實現異步春季由M. Deinum 的建議使用相同的未來的方法和得到它的工作,