ItemWriter提交的第一个提交间隔为

时间:2019-05-06 08:52:02

标签: java spring-batch itemwriter

我正在尝试从数据库中选择数据,更新每个对象,然后在项目编写器中更新数据库。

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

该配置非常基本,读取器,写入器和commmit间隔为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。

更新

我认为这个问题是由于与数据库的事务引起的,因为现在它根本不提交给数据库。但是我暂时无法解决。

1 个答案:

答案 0 :(得分:1)

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

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