如何使ItemReader读取2个表

时间:2012-11-08 02:27:24

标签: spring-batch

我必须创建一个批处理作业来进行财务对帐。现在我有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专家都能提出建议吗?

1 个答案:

答案 0 :(得分:2)

这里的问题是你的前两个步骤是面向块的,但第三个步骤不是。虽然前两个可能具有通常的读取 - 处理 - 写入循环,但是依赖于前两个的第三个步骤是一次操作。与批处理域中的文件复制完全不同。

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

这就是TaskletStep帮助

的地方
  

Tasklet是一个简单的接口,有一个方法,即execute   将由TaskletStep重复调用,直到它返回   RepeatStatus.FINISHED或抛出异常来表示失败。

因此,将第三步实现为Tasklet而不是以块为导向的方式。