【发布时间】:2017-05-12 19:29:30
【问题描述】:
我正在做一个使用 Spring Boot、Spring Batch 和 Camel 的项目。
批处理是通过调用休息端点来启动的。休息控制器启动一个骆驼路线,该路线启动弹簧批处理作业流程(通过弹簧批处理骆驼组件)。
我无法控制调用我的应用程序的外部应用程序。我的申请是更大的夜间工作流程的一部分。
批处理作业可能需要很长时间才能完成,因此外部应用程序会通过另一个休息端点定期轮询我的批处理作业,询问作业是否完成。它通过使用它想要状态的 jobExecution 的 id 轮询状态休息端点来做到这一点。
为了完成这个流程,我实现了一个休息控制器,它通过 ProducerTemplate 启动骆驼路线。我的问题是在开始骆驼路线后立即返回作业执行 ID。我不想让 rest 调用等到作业完成才返回。
startJobViaRestCall ------> createBatchJob ----> runBatchJobUntilDone
|
|
Return jobExecutionData |
<----------------------------------
我尝试过使用异步调用和期货,但没有成功。我也尝试过使用 Camels 窃听器,但无济于事。问题是只有“onComplete”事件。我需要一个在创建作业后立即返回但不运行的钩子。
例如,以下代码等待批处理作业完成,然后返回我要发回的 JobExecution 数据(以 json 格式)。这是有道理的,因为 extractFutureBody 会等到响应准备好。
@RestController
@Slf4j
public class BatchJobController {
@Autowired
ProducerTemplate producerTemplate;
@RequestMapping(value = "/batch/job/start", method = RequestMethod.GET)
@ResponseBody
public String startBatchJob() {
log.info("BatchJob start called...");
String jobExecution = producerTemplate.extractFutureBody(producerTemplate.asyncRequestBody(BatchRoute.ENDPOINT_JOB_START, ""), String.class);
return jobExecution;
}
}
骆驼路线是对spring-batch-component的简单调用
public class BatchRoute<I, O> extends BaseRoute {
private static final String ROUTE_START_BATCH = "spring-batch:springBatchJob";
@Override
public void configure() {
super.configure();
from(ENDPOINT_JOB_START).to(ROUTE_START_BATCH);
}
}
关于如何尽快返回 JobExecution 数据的任何想法?
【问题讨论】:
标签: spring-boot apache-camel spring-batch