我正在做一个项目,我们正在使用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数据可用时立即返回它,有什么想法吗?
不确定如何在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甚至不会触发作业。 我在这里错过了什么,或者我在这里做错了什么。?请建议。