繁体   English   中英

如何与 Spring 批次并行启动相同的作业?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM