我正在spring-batch应用程序的ItemProcessor中遍历一个列表,但出现此错误:
java.util.ConcurrentModificationException: null
当我将批处理配置设置为使用单个线程时,它可以正常工作。我正在使用SimpleAsyncTaskExecutor。客户是一个实体,并且具有客户别名列表。
private void fillCustomer(final Customer customer, final ExtractLine result){
CustomerAlias customerAlias = customer.getCustomerAlias().stream().filter(s -> s.getAliasType().isAster()).findFirst().orElse(nullAlias);
result.setCustomer(customerAlias.getCalNmeAliasName());
}
java.util.ConcurrentModificationException: null
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
at org.hibernate.collection.internal.AbstractPersistentCollection$IteratorProxy.next(AbstractPersistentCollection.java:815)
at java.util.Spliterators$IteratorSpliterator.tryAdvance(Spliterators.java:1812)
at java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:126)
at java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:498)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:485)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:152)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:464)
at com.liq.sub.impl.MyProcessor.fillCustomer(MyProcessor.java:107)
答案 0 :(得分:5)
当我将批处理配置设置为使用单个线程时,它工作正常。
然后答案很简单:当前有其他线程正在迭代该集合。
现在,您需要退后一步,并确定在此代码运行时可能会在源代码中的何处修改集合。
没有“魔术”可以帮助避免这种情况。