我目前使用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
提交,但是再次,我担心它不会很好地处理工作失败。
答案 0 :(得分:0)
我在编写问题时找到了答案,所以我会在这里发布。
中所述默认情况下,所有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