我正在 spring-batch 应用程序中迭代 ItemProcessor 中的列表,但收到此错误:
java.util.ConcurrentModificationException: null
当我将批处理配置设置为使用单线程时,它工作正常。我正在使用 SimpleAsyncTaskExecutor。 Customer 是一个实体,它有一个 CustomerAlias 列表。
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)
最佳答案
When I set my batch config to use a single thread it works fine.
那么答案非常简单:其他一些线程当前正在迭代该集合。
现在您需要退一步并确定在代码运行时集合可能在源代码中被修改的位置。
没有任何“魔法”可以帮助避免这种情况。
关于java - 通过集合进行迭代期间出现 ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56662111/