[英]How to Launch the Same Job in Parallel with Spring Batch?
我正在尝试并行启动同一个作业,该作业使用 JdbcCurorItemReader 从数据库表读取并将其写入另一个表。 该表仅包含一列和 integer。 我用 SimpleAsyncTaskExecutor 创建了一个 JobLauncher。 我正在使用 for 循环运行作业。 工作似乎是并行开始的,但我为读者收到了各种错误。 如“意外的cursor position变化。”,“阅读器必须打开才能阅读。” 和“无法初始化阅读器”。 我应该怎么做才能解决这个问题?
@Bean
public JobLauncher batchJobLauncher(SimpleAsyncTaskExecutor simpleAsyncTaskExecutor, JobRepository jobRepository){
SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
jobLauncher.setTaskExecutor(new SimpleAsyncTaskExecutor(){{
setConcurrencyLimit(20);
}});
jobLauncher.setJobRepository(jobRepository);
return jobLauncher;
}
@Bean
public JdbcBatchItemWriter<Number> writer(DataSource dataSource){
return new JdbcBatchItemWriterBuilder<Number>()
.itemPreparedStatementSetter(new ItemPreparedStatementSetter<Number>()
{
@Override
public void setValues(Number number, PreparedStatement preparedStatement) throws SQLException
{
preparedStatement.setInt(1, Number.getNumber());
}
})
.dataSource(dataSource)
.sql("INSERT INTO INTEGER_NUMBER2(NUMBER) VALUES (?)")
.build();
}
@Bean
public JdbcCursorItemReader<Number> reader(DataSource dataSource){
return new JdbcCursorItemReaderBuilder<Number>()
.dataSource(dataSource)
.sql("SELECT INTEGER_NUMBER FROM NUMBER")
.rowMapper(new NumberRowMapper())
.saveState(false)
.build();
}
for(int i=0; i<5; i++){
batchJobLauncher.run(job, new JobParametersBuilder().addLong("Num_Id", i)).toJobParameters());
}
JdbcCursorItemReader
不是线程安全的。 根据您的代码,它被声明为 singleton bean 并在线程之间共享。 您可以做的是将其包装在SynchronizedItemStreamReader
中或使其成为一个步骤范围的 bean。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.