2017-01-31 53 views
2

我有一個Spring Boot 1.3.5 web應用程序(運行在Tomcat 8上),它的一個功能是通過REST聯繫第三方API並啓動許多長工作(從1到周圍可能30取決於用戶輸入,每個用自己的REST調用在for循環中)。我在一個使用帶有一些參數的POST的控制器中擁有所有這些邏輯。Spring和後臺線程執行

我需要的是在API確認每個作業之後啓動一個後臺任務,它將傳遞一些參數(作業ID)並定期(〜30秒)輪詢另一個API以獲取作業輸出(再次,這些工作可能需要幾秒鐘到一個小時,並且得到它的工作大約需要3-4秒,再加上解析一個長字符串)並根據它們的狀態做一些業務邏輯(現在更新數據庫記錄)

不過,我不確定要使用哪個TaskExecutor,或者我是否應該使用Java的Future結構。我可能會受益於線程池,它只會並行運行X個線程,並排隊其他線程以使服務器不會超載。有沒有我可以學習和開始的例子?我現有的代碼

樣品:

@RequestMapping(value={"/job/launch"}, method={RequestMethod.POST}) 
public ResponseEntity<String> runJob(HttpServletRequest req) { 
    for (int deployments=1; deployments <= deployments_required; deployments++) { 
     httpPost.setEntity((HttpEntity)new StringEntity(jsonInput)); 
     CloseableHttpResponse response = httpclient.execute(httpPost); 
     HttpEntity entity = response.getEntity(); 
     responseString = EntityUtils.toString(entity, "UTF-8"); 
     JsonObject jsonObject = new JsonParser().parse(responseString).getAsJsonObject(); 
     if (response.getStatusLine().getStatusCode() != 200) { 
      resultsNotOk.add(new ResponseEntity<String>(jsonObject.get("message").getAsString(), HttpStatus.INTERNAL_SERVER_ERROR)); 
      continue; 
     } 
     String deploymentId; 
     deploymentId = jsonObject.get("id").getAsString(); 
     // Start background task to keep checking the job every few seconds and find created instance IP addresses 
     start_checking_execution(deploymentId); 
    } 
} 

(是的,這個代碼可以更好地投入服務,但它最初建爲的就是讓我沒有移動它但它可能是一個好現在時間做到這一點)

回答

0

我會說這是爲Spring Batch

工作,你可以定義閱讀器/處理器源讀取到寫入目標對象(轉換)/作家與邏輯工作

您可以使用JobOperator獲取作業狀態。見job status transitions

+0

我需要的不是完全的工作狀態,而是它的日誌的一部分,我可以查詢外部API(對不起,我已經編輯了這個問題來反映這一點) – fernandopcg