返回工作ID"立即"对于春季批处理作业完成之前

时间:2016-12-28 13:40:51

标签: spring-boot apache-camel spring-batch

我正在开发一个使用Spring Boot,Spring Batch和Camel的项目。

通过调用rest端点启动批处理。其余控制器启动一个启动弹簧批处理作业流程的驼峰路径(通过弹簧批处理驼峰组件)。

我无法控制调用我的应用程序的外部应用程序。我的申请是更大的夜间工作流程的一部分。

批处理作业可能需要很长时间才能完成,因此外部应用程序会定期通过另一个休息端点轮询我的批处理作业,询问作业是否完整。它通过使用它想要状态的jobExecution的id轮询状态休息端点来完成此操作。

为了完成这个流程,我实现了一个休息控制器,它通过ProducerTemplate启动camel路由。我的问题是在启动camel路由后立即返回作业执行ID。我不希望其余的电话等到工作完成后再回来。

startJobViaRestCall ------> createBatchJob ----> runBatchJobUntilDone
                                  |
                                  |
       Return jobExecutionData    |
<----------------------------------

我尝试过使用异步调用和期货,但没有运气。我也尝试使用Camels窃听无效。问题是只有&#34; onComplete&#34;事件。我需要一个挂钩,一旦创建了作业就会返回,但不会运行。

例如,以下代码在返回批处理作业之前等待,然后返回我想要发回的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数据可用时立即返回的任何想法?

1 个答案:

答案 0 :(得分:1)

不确定如何在Camel中执行此操作,但这里是使用spring-rest执行作业的示例。

set bouncing only one side top side.

您可以通过修改JobLauncher使作业异步。

@RestController
public class KpRest {

    private static final Logger LOG = LoggerFactory.getLogger(KpRest.class);
    private static String RUN_ID_KEY = "run.id";

    @Autowired
    private JobLauncher launcher;

    private final AtomicLong incrementer = new AtomicLong();


    @Autowired
    private Job job;


    @RequestMapping("/hello")
    public String sayHello(){

        try {
            JobParameters parameters = new JobParametersBuilder().addLong(RUN_ID_KEY, incrementer.incrementAndGet()).toJobParameters();
            JobExecution execution = launcher.run(job, parameters);
            LOG.info("JobId {}, JobStatus {}", execution.getJobId(), execution.getStatus().getBatchStatus());
            return String.valueOf(execution.getJobId());
        } catch (JobExecutionAlreadyRunningException | JobRestartException | JobInstanceAlreadyCompleteException
                | JobParametersInvalidException e) {
            LOG.info("Job execution failed, {}", e);
        }
        return "Some Error";
    }
}

有关详细信息,请参阅documentation