2012-11-08 27 views
2

我必须创建批量作业才能进行财务调节。现在,我有3个步骤:如何使项目阅读器读取2个表格

第1步:阅读来自第三方的XML,转换这在我们的领域对象,写在DB(表1)

第2步:阅读我们的交易数据存储中的FLATFILE在DB(表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,但我仍然有遍历集合了同样的问题,直到我得到一个空。

因此,在总结,我想读2页不同的表,并得到2列表:

List<TransactionThirdParty> 
List<TransactionHome> 

然后我ItemProcesssor会检查是否两个列表都是平等与否,是一个有着或多或少的交易,然后在other..etc

任何Spring Batch的专家可以建议的东西吗?

回答

2

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

所以你不应该在这里使用ItemReader的方式,因为你没有退出条件(这就是为什么你永远不会从读者获得空值,它不能知道源何时耗尽,因为它不处理线或记录。

这就是TaskletStep帮助

这个tasklet是一个简单的界面,有一个方法,执行该 将是一个由TaskletStep反复调用,直到它返回 RepeatStatus.FINISHED或抛出异常以指示失败。

因此,请将您的第三步作为Tasklet而不是面向块的方式来实现。

+0

谢谢。我会研究这一点。 Ttyl – Cygnusx1

+0

所以,如果我明白了。我应该做我的阅读(调用我的两个dao方法),我的处理和我的写作都在一个tasklet中?我没有数百万的记录,但我会在50K的范围内。我不知道这 – Cygnusx1

+0

因为你写道“我的ItemProcesssor将检查,如果两个列表是否等于或不是,是有或多或少的尝试,然后其他..等”我没有看到其他方式。如果您的业务逻辑规定您要比较两个DAO的结果,那么tasklet就是要走的路。但是,如果我误解了上面的一行,并且需要逐条记录比较(而不是它们的列表),那么您不应该使用这些dao功能 –