Spring 批量重启
Spring Batch restart
我是 Spring Batch 的新手。我有一些关于重启的问题。我知道默认情况下启用重启功能。我需要做任何额外的代码来重新启动任何工作吗?哪些作业可以重新启动。如何测试我的批处理应用程序是否可重启。我试图再次停止批处理过程和 运行。它总是在执行新作业。
下面是我的代码:
@Bean
@Qualifier("dataTransferJob")
public Job dataJob() {
return jobBuilderFactory.get("data-transfer-job")
.listener(jobExecutionListener())
.flow(step()).end().build();
}
@Bean
public Step step() {
return stepBuilderFactory.get("data-transfer-step")
.<TestData, TestDataVO>chunk(100)
.reader(reader())
.processor(process())
.writer(writer)
.taskExecutor(threadPool)
.transactionManager(transactionManager)
.listener(stepExecutionListener())
.listener(chunkListener())
.throttleLimit(10)
.build();
}
@PersistenceContext
private EntityManager em;
@Bean(destroyMethod="")
public ItemReader<TestData> reader() {
JpaPagingItemReader<TestData> itemReader = new JpaPagingItemReader<>();
try {
String sqlQuery = "SELECT * FROM TEST_DATA";
JpaNativeQueryProvider<TestData> queryProvider = new JpaNativeQueryProvider<TestData>();
queryProvider.setSqlQuery(sqlQuery);
queryProvider.setEntityClass(TestData.class);
queryProvider.afterPropertiesSet();
itemReader.setEntityManagerFactory(em.getEntityManagerFactory());
itemReader.setPageSize(100);
itemReader.setQueryProvider(queryProvider);
itemReader.afterPropertiesSet();
itemReader.setSaveState(true);
}
catch (Exception e) {
System.out.println("BatchConfiguration.reader() ==> error " + e.getMessage());
}
return itemReader;
}
然后使用 CommandLineRunner 午餐工作
@Autowired
JobLauncher jobLauncher;
@Autowired
@Qualifier("dataTransferJob")
Job dataJob;
JobParametersBuilder paramsBuilder = new JobParametersBuilder();
paramsBuilder.addString("date", LocalDateTime.now().toString());
JobExecution jobExecution=jobLauncher.run(dataJob, paramsBuilder.toJobParameters());
在 Spring 批处理中,作业实例由(标识)作业参数标识。请查看 The domain language of Batch 部分以了解 Job
、JobInstance
和 JobExecution
概念之间的差异以及如何使用参数来识别作业实例。
I tried to stop the batch middle of process and run again. It always executing a new job.
在你的情况下,因为你要在每个 运行 上添加当前时间作为作业参数:
JobParametersBuilder paramsBuilder = new JobParametersBuilder();
paramsBuilder.addString("date", LocalDateTime.now().toString());
你每次都会得到不同的作业实例。如果你想再次启动同一个作业实例,你需要将第一次尝试的相同时间戳作为作业参数传递。
我是 Spring Batch 的新手。我有一些关于重启的问题。我知道默认情况下启用重启功能。我需要做任何额外的代码来重新启动任何工作吗?哪些作业可以重新启动。如何测试我的批处理应用程序是否可重启。我试图再次停止批处理过程和 运行。它总是在执行新作业。
下面是我的代码:
@Bean
@Qualifier("dataTransferJob")
public Job dataJob() {
return jobBuilderFactory.get("data-transfer-job")
.listener(jobExecutionListener())
.flow(step()).end().build();
}
@Bean
public Step step() {
return stepBuilderFactory.get("data-transfer-step")
.<TestData, TestDataVO>chunk(100)
.reader(reader())
.processor(process())
.writer(writer)
.taskExecutor(threadPool)
.transactionManager(transactionManager)
.listener(stepExecutionListener())
.listener(chunkListener())
.throttleLimit(10)
.build();
}
@PersistenceContext
private EntityManager em;
@Bean(destroyMethod="")
public ItemReader<TestData> reader() {
JpaPagingItemReader<TestData> itemReader = new JpaPagingItemReader<>();
try {
String sqlQuery = "SELECT * FROM TEST_DATA";
JpaNativeQueryProvider<TestData> queryProvider = new JpaNativeQueryProvider<TestData>();
queryProvider.setSqlQuery(sqlQuery);
queryProvider.setEntityClass(TestData.class);
queryProvider.afterPropertiesSet();
itemReader.setEntityManagerFactory(em.getEntityManagerFactory());
itemReader.setPageSize(100);
itemReader.setQueryProvider(queryProvider);
itemReader.afterPropertiesSet();
itemReader.setSaveState(true);
}
catch (Exception e) {
System.out.println("BatchConfiguration.reader() ==> error " + e.getMessage());
}
return itemReader;
}
然后使用 CommandLineRunner 午餐工作
@Autowired
JobLauncher jobLauncher;
@Autowired
@Qualifier("dataTransferJob")
Job dataJob;
JobParametersBuilder paramsBuilder = new JobParametersBuilder();
paramsBuilder.addString("date", LocalDateTime.now().toString());
JobExecution jobExecution=jobLauncher.run(dataJob, paramsBuilder.toJobParameters());
在 Spring 批处理中,作业实例由(标识)作业参数标识。请查看 The domain language of Batch 部分以了解 Job
、JobInstance
和 JobExecution
概念之间的差异以及如何使用参数来识别作业实例。
I tried to stop the batch middle of process and run again. It always executing a new job.
在你的情况下,因为你要在每个 运行 上添加当前时间作为作业参数:
JobParametersBuilder paramsBuilder = new JobParametersBuilder();
paramsBuilder.addString("date", LocalDateTime.now().toString());
你每次都会得到不同的作业实例。如果你想再次启动同一个作业实例,你需要将第一次尝试的相同时间戳作为作业参数传递。