0

我正在尝试从数据库中选择数据,更新每个对象,然后在 itemwriter 中更新数据库。

每次更新后我都尝试刷新 DAO,但它没有任何改变。

配置非常基本,有一个读取器、一个写入器和 100 的提交间隔。

阅读器按预期工作:

@Override
public Order read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {
    if(iterator == null) {
        List<Order> all = findOrders();
        iterator = all.listIterator();
    }

    if (iterator.hasNext()) {
        return iterator.next();
    } else {
        return null;
    }
}

作者也很基础:

public void write(List<? extends Order> items) throws Exception {
    @SuppressWarnings("unchecked")
    List<Order> listOrder = (List<Order>) items;

    try {
        for(Order o : listOrder) {
            etatCommandeServiceImpl.updateEtatCommande(o);
        }
    }catch(Exception e) {
        if (log.isErrorEnabled()) {
            log.error("ERROR {}", e);
        }
        throw e;
    }
}

问题是前 100 条记录已提交,其余的则未提交。Spring批处理表显示它读取所有记录并多次提交,但是当我签入数据库时​​它只提交一次。

Spring-batch 的版本是 2.2.6。

更新

我认为这个问题是由于与数据库的事务,因为现在它根本没有提交到数据库。但我暂时无法弄清楚。

4

1 回答 1

1

问题是您从 ItemReader 返回 null。如果您返回 null,则 Spring 批处理将假定已到达提要结束并终止作业。由于您在每个块(在您的情况下为 100)之后返回 null,因此 Sprint 批处理在处理 100 条记录后将被终止。

请使用@PostConstruct 创建方法并获取您要处理的所有记录,并将您的 ItemReader 更改为一次返回 1,并在读取所有记录时返回 null。

于 2019-05-06T15:37:46.830 回答