我必须创建一个批处理作业来进行财务对帐。现在我有3个步骤:
步骤1:从第三方读取XML,在我们的域对象中转换它,在DB中写入(表1)
步骤2:从我们的交易数据存储中读取flatFile,写入DB(表2)
步骤3:读取一个聚合器对象中的table1和table2,处理这两个列表以查找差异并设置状态码,在表2中写入状态码
我的问题在于step3。我找不到一个很好的解决方案让我的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;
}
}
此Reader使用两个已实现的服务(DAO)来读取表和返回域对象。我从我们这里获取了两个事务列表,并将它们放在聚合器对象中。这个对象将传递给ItemProcessor,我可以做我的业务逻辑...但是这个读者开始一个无限循环,因为它永远不会读取null。
我读到了关于ItemReaderAdapter的内容,但是我仍然遇到了一个循环遍历集合的问题,直到我得到一个null。
总而言之,我想阅读2个不同的表并获得2个List:
List<TransactionThirdParty>
List<TransactionHome>
然后我的ItemProcesssor将检查两个列表是否等于,是一个有更多或更少的事务然后另一个..等等
任何Spring Batch专家都能提出建议吗?
答案 0 :(得分:2)
这里的问题是你的前两个步骤是面向块的,但第三个步骤不是。虽然前两个可能具有通常的读取 - 处理 - 写入循环,但是依赖于前两个的第三个步骤是一次操作。与批处理域中的文件复制完全不同。
所以你不应该在这里使用ItemReader方法,因为你没有退出标准(这就是为什么你永远不会从读者那里得到空值,它不知道源何时耗尽,因为它没有处理一行或者记录。
这就是TaskletStep帮助
的地方Tasklet是一个简单的接口,有一个方法,即execute 将由TaskletStep重复调用,直到它返回 RepeatStatus.FINISHED或抛出异常来表示失败。
因此,将第三步实现为Tasklet而不是以块为导向的方式。