spring-batch - 如何让ItemReader读取2个表

标签 spring-batch

我必须创建一个批处理作业来进行财务对账。现在我有3个步骤:

第 1 步:从第三方读取 XML,将其转换到我们的域对象中,写入 DB(表 1)

第 2 步:从我们的交易数据存储中读取 flatFile,写入数据库(表 2)

第 3 步:在 aggregatorObject 中读取表 1 和表 2,处理两个列表以查找差异并设置状态代码,在表 2 中写入状态代码

我的问题出在步骤3上。我找不到一个好的解决方案来让我的 ItemReader 读取 2 个 SQL。

我从这样的自定义 ItemReader 开始:

package batch.concilliation.readers;


@Component("conciliationReader")
public class TransactionReader implements ItemReader<TransactionsAgragegator>{

private final Logger log = Logger.getLogger(TransactionReader.class);

@Autowired
private ConciliationContext context;

@Autowired
private ServiceSommaireConciliation serviceTransactionThem;

@Autowired
private ServiceTransactionVirement serviceTransactionUs;


@Override
public TransactionsAgragegator read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {

    TransactionsAgragegator agregator = new TransactionsAgragegator();

    SommaireConciliationVirementInterac sommaire = serviceSommaireThem.findByRunNo(context.getRunNo());

    List<TransactionVirement> journalSic = serviceTransactionUs.findByTimestamp(sommaire.getBeginDate(), sommaire.getEndDate()); 

    // on place ces deux listes dans l'objet agregteur.
    agregator.setListeTransactionThem(sommaire.getPayments());
    agregator.setListeTransactionsUs(journalSic);

    return aggregator;
}

}

此读取器使用两个已实现的服务(DAO)来读取表并返回域对象。我从我们和他们那里获取两个交易列表,并将它们放入聚合器对象中。该对象将被传递给 ItemProcessor,我可以执行我的业务逻辑...但是该读取器启动无限循环,因为它永远不会读取 null。

我读到了有关 ItemReaderAdapter 的内容,但我仍然遇到循环遍历集合直到得到 null 的相同问题。

总而言之,我想读取 2 个不同的表并获得 2 个列表:

List<TransactionThirdParty>
List<TransactionHome>

然后我的 ItemProcesssor 将检查两个列表是否相等,一个列表的事务数是否多于或少于另一个列表......等等

任何 Spring Batch 专家都可以提出建议吗?

最佳答案

这里的问题是你的前两个步骤是面向 block 的,但第三个步骤不是。虽然前两个步骤可能具有通常的读取-处理-写入周期,但依赖于前两个步骤的第三步是一次性操作。这与在批处理域中复制文件没有什么不同。

所以你不应该在这里使用 ItemReader 方式,因为你没有退出标准(这就是为什么你永远不会从阅读器获得空值,它不知道源何时耗尽,因为它不处理行或记录一下。

那就是TaskletStep帮助

The Tasklet is a simple interface that has one method, execute, which will be a called repeatedly by the TaskletStep until it either returns RepeatStatus.FINISHED or throws an exception to signal a failure.

因此,将第三步实现为 Tasklet而不是面向 block 的方式。

关于spring-batch - 如何让ItemReader读取2个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13281559/

相关文章:

java - 如何在 Java 并行程序中获得理想的线程数?

kubernetes - Spring 批量迁移到kubernetes平台

java - 基于Job参数配置Spring Batch Writer

java - 为什么数组转列表又转数组

java - Spring批处理不将作业实例插入数据库

java - 如何避免在 Spring Cloud Data Flow 上状态仍在运行时重新启动任务

java - Quartz CRON 只触发一次作业

java - JpaPagingItemReader 无法读取数据并转到下一步

spring - 如何在 Spring Batch 中获取 ItemWriter 中的 jobId

spring-batch - 在 Spring Batch 中从数据库中读取记录