您的位置:首页 > 编程语言 > Java开发

spring batch 使用ItemReaderAdapter导致读写无限循环问题

2017-07-20 09:25 531 查看
当同步数据时reader 或者 writer 调用现有的 service时候, 会用到ItemReaderAdapter或者ItemWriterAdapter

例如

ItemReaderAdapter adapter = new ItemReaderAdapter();
adapter.setTargetObject(orderService);
adapter.setTargetMethod("dealOrder");

但是上面的写法,会导致reader 和 writer 无限循环,不能停止因此需要reader 计数 重新实现 ItemStream
public class OrderAdapterReader extends AbstractItemCountingItemStreamItemReader {

@Autowired
private OrderService orderService;
@Autowired
private HubOrderSqlOperation hubOrderSqlOperation;

private List<MongoOrder> mongoOrderList;

private final String ecName = "orderReaderContext";

public OrderAdapterReader() {
setName(ecName);
}

@Override
protected MongoOrder doRead() throws Exception {
MongoOrder mongoOrder = mongoOrderList.get(getCurrentItemCount() - 1);
return mongoOrder;
}

@Override
protected void doOpen() throws Exception {
mongoOrderList = (List<MongoOrder>) orderService.getDayOrders().getData();
if (CollectionUtils.isEmpty(mongoOrderList)){
setMaxItemCount(0);
}else{
List<Long> orderIds = mongoOrderList.stream().map(MongoOrder::getId).collect(Collectors.toList());
hubOrderSqlOperation.deleteOrderByIds(orderIds);
setMaxItemCount(mongoOrderList.size());
}

}

@Override
protected void doClose() throws Exception {
if (!CollectionUtils.isEmpty(mongoOrderList)){
mongoOrderList.clear();
}
setMaxItemCount(0);
setCurrentItemCount(0);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring batch
相关文章推荐