2017-01-31 54 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