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

当同步数据时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);
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值