gpt4 book ai didi

spring - 如果出现异常,如何覆盖 Spring Batch CompositeItemWriter 管理委托(delegate)编写者的事务?

转载 作者:行者123 更新时间:2023-12-03 17:11:11 25 4
gpt4 key购买 nike

我正在扩展这个 How does Spring Batch CompositeItemWriter manage transaction for delegate writers?这里的问题:
在我的情况下,我有一个以下 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;
}
场景 - 假设第一作者工作得很好,第二作者产生异常,那么第三和第四作者没有被调用这就是 Automic由于事务回滚,Spring Batch 发生自然默认。
在这里,即使第二个写入器出现任何异常,我也想成功调用第三个和第四个写入器并保存数据,我还想成功保存第一个写入器和第二个写入器的数据.. 我想存储的唯一异常数据到借助 SkipListener 的错误表以确定哪些记录是垃圾或垃圾。
解决方案 - 实现 以上场景 ,我们添加了 @Transactional(propagation = Propagation.REQUIRES_NEW)在每个 writer 的 write 方法上,第一个 writer 现在保存数据,第二个 writer 生成异常(使用 namedJdbcTemplate.batchUpdate() 批量更新数据)我们正在缓存它并重新抛出它,但我们可以看到 提交级别降低到 1 (偏离路线以识别确切的垃圾记录)并且当第二个写入器再次出现异常时,第一个写入器被调用,它正在保存重复数据,第二个、第三个和第四个写入器被调用,但垃圾记录也没有流向第三和第四作者。
在这里,如果单个或多个记录是垃圾,我不希望整个批处理作业停止,因为此作业对于我们每次运行都至关重要。如果我们可以保存所有没有出现异常的数据并且只在 SkipListener 的帮助下将异常数据保存到错误表中,有什么办法吗?如果可能或任何其他方式?
如果我们可以将任何步骤的(READER 或 PROCESSOR)部分的批处理组件重用到另一个步骤,有什么办法吗?

最佳答案

我看不出有一种方法可以调整 spring-batch 的单个事务以将整个 block 写入原子,而不是您希望将原子性保留给单个写入者的想法 skiplistener .
我不确定这是否可能,但您可能能够快速测试它。这就是消息在某些集成框架(如 Camel )中将异常从一个处理器传递到错误处理流程的方式。

  • 您的项目阅读器应返回 EmployeeWrapper其中包含 employee记录并有一个字段来存储异常。
  • 您的 CompositeItemWriter 收到 List<EmployeeWrapper>复合作家有 5 个作家而不是 4 个。第 5 个作家会做你的 SkipListener会做。
  •     List<ItemWriter<? super EmployeeWrapper>> employee = new ArrayList<>();
    employee.add(employeeWriter());
    employee.add(departmentWriter());
    employee.add(stockWriter());
    employee.add(purchaseWriter());
    employee.add(errorRecordWriter());
  • 您的前 4 个独立作者从不抛出异常,而是将其标记为已处理,但将捕获的异常添加为 EmployeeWrapper 的属性。
  • 您的第 5 个 errorRecordWriter接收所有记录,检查任何添加了异常属性的记录并将它们写入错误表。如果写入错误记录失败,您可以抛出异常,所有 5 个写入器将被重试。
  • 关于批量更新失败时如何知道哪条记录是错误记录。似乎当 block 中发生错误时, Spring 回滚该 block 并开始在该 block 中逐条记录重试它,以便它知道哪条记录是有问题的。所以你可以在你的个人作家身上做同样的事情。即捕获批量更新异常,然后一一重试,将错误记录分开
  • 关于spring - 如果出现异常,如何覆盖 Spring Batch CompositeItemWriter 管理委托(delegate)编写者的事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63296065/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com