Jef*_*ook 5 spring spring-batch
我正在扩展这个Spring Batch CompositeItemWriter 如何管理委托编写者的事务?问题在这里:
在我的情况下,我有一个下面的CompositeItemWriter将数据写入同一数据库的多个表中,在写入数据之前它通过实现各种业务规则来转换数据。这里一个记录可能满足不同的业务规则等。因此一个作者可能比其他人获得更多的数据。
@Bean
public CompositeItemWriter<Employee> EmployeeCompositeWriter() throws Exception {
List<ItemWriter<? super Employee>> employee = new ArrayList<>();
employee.add(employeeWriter());
employee.add(departmentWriter());
employee.add(stockWriter());
employee.add(purchaseWriter());
CompositeItemWriter<Employee> compositeItemWriter = new CompositeItemWriter<>();
compositeItemWriter.setDelegates(employee);
compositeItemWriter.afterPropertiesSet();
return compositeItemWriter;
}
Run Code Online (Sandbox Code Playgroud)
场景- 假设第一个写入器工作得很好,第二个写入器生成异常,然后第三个和第四个写入器没有被调用这是Automic由于事务回滚而在 Spring Batch 中发生的默认情况。
这里即使第 2 个写入器出现任何异常,我也想成功调用第 3 个和第 4 个写入器并保存数据,我也想成功保存第 1 个写入器和第 2 个写入器的数据......只有我想存储到的异常数据错误表有助于SkipListener识别哪些记录是垃圾或垃圾。
解决方案 - 为了实现上述场景,我们添加@Transactional(propagation = Propagation.REQUIRES_NEW)了每个编写器的写入方法,第一个编写器现在保存数据,第二个编写器生成异常(namedJdbcTemplate.batchUpdate()用于批量更新数据)我们正在缓存它并重新抛出它,但我们可以看到提交级别减少到 1(偏离路线以识别确切的垃圾记录)并且第二个写入器再次出现异常的时刻第一个写入器被调用并且它正在保存重复数据和写入器第二、第三和第四个被调用,但还有那个垃圾记录没有流向第三和第四作者。
如果单个或几个记录是垃圾,我不希望整个批处理作业停止,因为这个作业对我们每次运行都至关重要。有没有什么办法可以把所有没有发生异常的数据都保存起来,只SkipListener在可能的情况下或其他任何方式的帮助下将异常数据保存到错误表中?
如果我们可以将任何步骤的(READER 或 PROCESSOR)部分之类的批处理组件重用到另一个步骤中,有什么办法吗?
| 归档时间: |
|
| 查看次数: |
637 次 |
| 最近记录: |