Spring Batch是否具有跟踪已处理行的功能?

时间:2015-08-09 22:47:51

标签: java spring spring-batch

我目前使用Spring Batch通过外部应用程序更新我的实体,该应用程序通过ODBC连接直接写入我的数据库。

为简单起见,我将在此处表示表模式的简化版本(在下面的Java代码中称为“importshipmentdata”):

id(integer)
entity1_data1(character varying)
entity1_data2(character varying)
entity2_data2(character varying)
import_date(date_created timestamp with time zone)

这是我的工作配置:

@Configuration
@EnableBatchProcessing
public class ImportShippingConfig {

    @Inject
    private JobBuilderFactory jobs;

    @Inject
    private StepBuilderFactory steps;

    @Inject
    private JobRepository jobRepository;

    @Inject
    private DataSource dataSource;


    @Bean
    public JobLauncher jobLauncher() throws Exception {
        SimpleJobLauncher jobLauncher;
        jobLauncher = new SimpleJobLauncher();
        jobLauncher.setJobRepository(jobRepository);
        jobLauncher.setTaskExecutor(new SimpleAsyncTaskExecutor());
        return jobLauncher;
    }

    @Bean
    public ItemReader<ImportShippingItem> reader() {
        JdbcCursorItemReader<ImportShippingItem> reader = new JdbcCursorItemReader<>();
        reader.setDataSource(dataSource);
        BeanPropertyRowMapper<ImportShippingItem> mapper = new BeanPropertyRowMapper<>(ImportShippingItem.class);
        reader.setSql("SELECT * FROM importshipmentdata");
        reader.setRowMapper(mapper);
        return reader;
    }

    @Bean
    public ItemProcessor<ImportShippingItem, ImportShippingItem> processor() {
        return new ImportShippingItemProcessor();
    }

    @Bean
    public ItemWriter<ImportShippingItem> writer() {
        return new ImportShippingItemWriter();
    }

    @Bean
    public Job ShippingImporter() {
        return jobs.get("ShippingImporter").start(importShipping()).build();
    }

    @Bean
    public Step importShipping() {
        return steps.get("importShipping")
            .<ImportShippingItem, ImportShippingItem>chunk(5)
            .reader(reader())
            .processor(processor())
            .writer(writer())
            .build();
    }

}

(不要被SELECT *冒犯,我还处于POC阶段:))

我可以使用import_date提交,但是再次,我担心它不会很好地处理工作失败。

1 个答案:

答案 0 :(得分:0)

我在编写问题时找到了答案,所以我会在这里发布。

documentation

中所述
  

默认情况下,所有ItemReader和ItemWriter实现都存储   在提交之前它们在ExecutionContext中的当前状态。   但是,这可能并不总是理想的行为。例如,   许多开发人员选择让他们的数据库阅读器“可重新运行”   使用过程指示器。将额外的列添加到输入数据中   表明它是否已被处理。当一个特定的   正在读取(或写出)正在处理的标志被翻转的记录   从虚假到真实。然后,SQL语句可以包含一个额外的   where子句中的语句,例如“where PROCESSED_IND = false”,   从而确保只返回未处理的记录   重启的情况。在这种情况下,最好不要存储任何内容   状态,例如当前行号,因为它将是无关紧要的   重启后。出于这个原因,所有读者和作家都包括   'saveState'属性:

因此,我只需在表格中添加processed列,并将查询更改为SELECT entity1_data1, entity1_data2, entity2_data1 FROM table WHERE processed = false

然后我会在撰写项目时将我的作者将列的值更改为true并将其设置为saveState=false