当前位置: 首页 > 知识库问答 >
问题:

在spring批处理作业完成前“立即”返回作业id

谭文林
2023-03-14

我正在做一个项目,我们正在使用Spring Boot、Spring Batch和Camel。

startJobViaRestCall ------> createBatchJob ----> runBatchJobUntilDone
                                  |
                                  |
       Return jobExecutionData    |
<----------------------------------
@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;
    }

}    
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个答案

汪翰墨
2023-03-14

不确定如何在Camel中完成,但是下面是使用Spring-Rest执行作业的示例。

@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";
    }
}

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

    @Bean
    public JobLauncher simpleJobLauncher(JobRepository jobRepository){
        SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
        jobLauncher.setJobRepository(jobRepository);
        jobLauncher.setTaskExecutor(new SimpleAsyncTaskExecutor());
        return jobLauncher;
    }

有关更多信息,请参阅文档

 类似资料:
  • > 我试图在作业完成之前返回Spring Batch作业ID。 我当前的实现只在作业完成后返回信息。 我使用批处理程序控制器和批处理服务,发布在下面。谢谢,我是新来的Spring Batch,经过详尽的搜索,找不到太多与我的问题相关的。有一个帖子有人使用Apache骆驼,但我没有。 控制器 服务 再次感谢。 编辑 我已将其添加到批处理配置中 编辑 在马哈茂德·本·哈辛的评论的帮助下,我解决了这个问

  • 我有以下工作要处理在一定的时间间隔或特别的基础上。 作业中的步骤如下: 我也想要用户界面,在那里我可以触发一个特别的基础上的工作,而且我应该能够提供参数从用户界面。 我想用Spring batch来完成这个任务,但它更多的是用于读->处理->写之类的工作。这里,在第一步中,我正在生成由第二步读取的数据。我不确定我是否还可以使用Spring batch来实现这个,或者有更好的方法来实现这个。

  • 当共享文件夹中的文件可用时,我希望立即运行Spring批处理作业。我已经制作了一个观察器服务来检查目录中的新条目,但是我如何触发我的批处理作业呢? 我做了以下更改- 现在,如果我尝试运行代码,我会得到下面的响应- 10.506秒内启动应用程序(JVM运行为11.676)2018-07-23 16:55:53.646信息18200---[Thread-2]S.C.A.AnnotationConfig

  • 我已经在一个订单中链接了一组Spring批处理作业。 我怀疑任务执行者。在独立的情况下,我们不指定任何任务执行器(默认值为SyncTaskExecutor),作业流工作正常。但是在Jboss中部署时,我们使用SimpleAsyncTaskExecutor,因为在Jboss中使用SyncTaskExecutor甚至不会触发作业。 我在这里错过了什么,或者我在这里做错了什么。?请建议。