运行 spring 来自控制器的批处理作业
run spring batch job from the controller
我正在尝试从控制器 运行 我的批处理作业。它将通过 cron 作业或通过访问特定的 link 来启动。
我正在使用 Spring 启动,没有 XML 只是注释。
在我当前的设置中,我有一个包含以下 bean 的服务:
@EnableBatchProcessing
@PersistenceContext
public class batchService {
@Bean
public ItemReader<Somemodel> reader() {
...
}
@Bean
public ItemProcessor<Somemodel, Somemodel> processor() {
return new SomemodelProcessor();
}
@Bean
public ItemWriter writer() {
return new CustomItemWriter();
}
@Bean
public Job importUserJob(JobBuilderFactory jobs, Step step1) {
return jobs.get("importUserJob")
.incrementer(new RunIdIncrementer())
.flow(step1)
.end()
.build();
}
@Bean
public Step step1(StepBuilderFactory stepBuilderFactory,
ItemReader<somemodel> reader,
ItemWriter<somemodel> writer,
ItemProcessor<somemodel, somemodel> processor) {
return stepBuilderFactory.get("step1")
.<somemodel, somemodel> chunk(100)
.reader(reader)
.processor(processor)
.writer(writer)
.build();
}
}
一旦我将 @Configuration
注释放在我的 batchService class 之上,作业就会在我 运行 应用程序后立即开始。它成功完成,一切都很好。现在,我想随时删除 @Configuration 注释和 运行 。有没有办法从控制器触发它?
谢谢!
由于您使用的是 Spring 引导,因此您应该在其中保留 @Configuration
注释,而不是将 application.properties 配置为在启动时不启动作业。您可以在此处的 Spring 引导文档中阅读有关 运行 作业在启动时(或不启动时)的自动配置选项的更多信息:http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#howto-execute-spring-batch-jobs-on-startup
您可以使用 JobLauncher
以编程方式启动批处理作业,它可以注入您的控制器。有关详细信息,请参阅 Spring Batch documentation,包括此示例控制器:
@Controller
public class JobLauncherController {
@Autowired
JobLauncher jobLauncher;
@Autowired
Job job;
@RequestMapping("/jobLauncher.html")
public void handle() throws Exception{
jobLauncher.run(job, new JobParameters());
}
}
您需要在 src/main/resources 中创建一个 application.yml 文件并添加以下配置:
spring.batch.job.enabled: false
进行此更改后,批处理作业将不会随着 Spring 启动而自动执行。批处理作业将在特定 link.
时触发
在这里查看我的示例代码:
https://github.com/pauldeng/aws-elastic-beanstalk-worker-spring-boot-spring-batch-template
我正在尝试从控制器 运行 我的批处理作业。它将通过 cron 作业或通过访问特定的 link 来启动。 我正在使用 Spring 启动,没有 XML 只是注释。
在我当前的设置中,我有一个包含以下 bean 的服务:
@EnableBatchProcessing
@PersistenceContext
public class batchService {
@Bean
public ItemReader<Somemodel> reader() {
...
}
@Bean
public ItemProcessor<Somemodel, Somemodel> processor() {
return new SomemodelProcessor();
}
@Bean
public ItemWriter writer() {
return new CustomItemWriter();
}
@Bean
public Job importUserJob(JobBuilderFactory jobs, Step step1) {
return jobs.get("importUserJob")
.incrementer(new RunIdIncrementer())
.flow(step1)
.end()
.build();
}
@Bean
public Step step1(StepBuilderFactory stepBuilderFactory,
ItemReader<somemodel> reader,
ItemWriter<somemodel> writer,
ItemProcessor<somemodel, somemodel> processor) {
return stepBuilderFactory.get("step1")
.<somemodel, somemodel> chunk(100)
.reader(reader)
.processor(processor)
.writer(writer)
.build();
}
}
一旦我将 @Configuration
注释放在我的 batchService class 之上,作业就会在我 运行 应用程序后立即开始。它成功完成,一切都很好。现在,我想随时删除 @Configuration 注释和 运行 。有没有办法从控制器触发它?
谢谢!
由于您使用的是 Spring 引导,因此您应该在其中保留 @Configuration
注释,而不是将 application.properties 配置为在启动时不启动作业。您可以在此处的 Spring 引导文档中阅读有关 运行 作业在启动时(或不启动时)的自动配置选项的更多信息:http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#howto-execute-spring-batch-jobs-on-startup
您可以使用 JobLauncher
以编程方式启动批处理作业,它可以注入您的控制器。有关详细信息,请参阅 Spring Batch documentation,包括此示例控制器:
@Controller
public class JobLauncherController {
@Autowired
JobLauncher jobLauncher;
@Autowired
Job job;
@RequestMapping("/jobLauncher.html")
public void handle() throws Exception{
jobLauncher.run(job, new JobParameters());
}
}
您需要在 src/main/resources 中创建一个 application.yml 文件并添加以下配置:
spring.batch.job.enabled: false
进行此更改后,批处理作业将不会随着 Spring 启动而自动执行。批处理作业将在特定 link.
时触发在这里查看我的示例代码: https://github.com/pauldeng/aws-elastic-beanstalk-worker-spring-boot-spring-batch-template