Added some more fixes. Should now fully work for your use case. have fun!
LieGrue, strub > Am 11.09.2019 um 13:48 schrieb Romain Manni-Bucau <[email protected]>: > > Pushed a first enhancement around that on master if you want to give a try > building the snapshot and patching tomee. > Still some work to do around tests and harnessing but sounds promising. > > Romain Manni-Bucau > @rmannibucau | Blog | Old Blog | Github | LinkedIn | Book > > > Le mer. 11 sept. 2019 à 12:24, Mark Struberg <[email protected]> a écrit : > And we are still looking into it whether we can make it go away (again). > But that isn't a guarantee that this will not cause any pains in other > containers as well. At least under heavy load. > And yikes, that's hard to test :( > > LieGrue, > strub > > > Am 11.09.2019 um 11:54 schrieb Romain Manni-Bucau <[email protected]>: > > > > We got some perf enhancements about Instance so it can be visible now > > whereas it was hidden before cause slower. > > > > Romain Manni-Bucau > > @rmannibucau | Blog | Old Blog | Github | LinkedIn | Book > > > > > > Le mer. 11 sept. 2019 à 11:51, Matthias Knappik > > <[email protected]> a écrit : > > Hi, > > Thank you for your response. I'll change our behavior in regards to > > concurrency. > > However, I would like to point out, that the test in our project was > > executed thousands of times without any problem in 7.1.0 and prior > > releases, while the issue is 100% reproducible with 8.0.0-M3. So I really > > wonder what causes this difference. > > > > Best Regards > > > > Matthias Knappik > > > > Senior Developer > > > > Faktor Zehn GmbH > > Friedenheimer Brücke 21 > > 80639 München > > > > Phone +49 89 520311-683 > > Fax +49 89 520311-8683 > > Mobile +49 151 582 56644 > > > > [email protected] > > http://www.ConVista.com > > > > -----Ursprüngliche Nachricht----- > > Von: Mark Struberg <[email protected]> > > Gesendet: Mittwoch, 11. September 2019 10:02 > > An: openwebbeans-user <[email protected]> > > Betreff: Re: NoSuchElementException in InstanceImpl#iterator() after > > upgrading openejb-core to 8.0.0-M3 > > > > To be honest, I'm not sure this is really a bug. > > > > a.) the CDI architecture guide basically says that whenever you use > > @ApplicationScoped in a multi-threaded scenario then you have to deal with > > concurrency yourself. After all those are not @Stateless EJBs... > > b.) The Instance definition also doesn't define that Instance is thread > > safe. > > > > So even if WE fix it, it is not guaranteed that you will be blowing up on > > many different containers. As it's not defined by the spec. > > > > LieGrue, > > strub > > > > > Am 11.09.2019 um 09:43 schrieb Romain Manni-Bucau <[email protected]>: > > > > > > Hi Matthias, > > > > > > I don't think it is a regression by itself since this is the behavior > > > since a long time but it is clearly a bug. > > > Will work on it very soon. > > > > > > Romain Manni-Bucau > > > @rmannibucau | Blog | Old Blog | Github | LinkedIn | Book > > > > > > > > > Le mer. 11 sept. 2019 à 09:24, Matthias Knappik > > > <[email protected]> a écrit : > > > Hi, > > > > > > after upgrading the openejb-core dependency in one of our projects from > > > 7.1.0 to 8.0.0-M3 in order to support java 11, one of our tests was > > > failing due to an NoSuchElementException in > > > org.apache.webbeans.inject.instance.InstanceImpl#iterator(). > > > > > > Our last executed code is: > > > > > > private Stream<PolicyPermissionService> permissionServices() { > > > > > > return StreamSupport.stream(permissionServices.spliterator(), > > > false); > > > > > > } > > > > > > > > > > > > A little bit of research showed, that this method is being executed in > > > parallel by an batch job, which explains the Exception: > > > InstanceImpl#iterator() seems not to be threadsafe. As a consequence, > > > removeFirst() gets executed, even if there is no Element in the List. > > > > > > > > > > > > A quick fix for us was to put the call into an synchronized block: > > > > > > private synchronized Stream<PolicyPermissionService> > > > permissionServices() { > > > > > > return StreamSupport.stream(permissionServices.spliterator(), > > > false); > > > > > > } > > > > > > > > > > > > However, I think it should not be required to do so and it was working > > > fine in 7.1.0. > > > > > > > > > > > > Stacktrace: > > > > > > java.util.NoSuchElementException > > > > > > at java.util.LinkedList.removeFirst(LinkedList.java:270) > > > > > > at java.util.LinkedList.pop(LinkedList.java:801) > > > > > > at > > > org.apache.webbeans.context.creational.CreationalContextImpl.removeInjectionPoint(CreationalContextImpl.java:142) > > > > > > at > > > org.apache.webbeans.inject.instance.InstanceImpl.iterator(InstanceImpl.java:256) > > > > > > at java.lang.Iterable.spliterator(Iterable.java:101) > > > > > > at > > > de.faktorzehn.ipm.core.services.user.PolicyPermissionServiceProvider.permissionServices(PolicyPermissionServiceProvider.java:46) > > > > > > at > > > de.faktorzehn.ipm.core.services.user.PolicyPermissionServiceProvider.getPermissionService(PolicyPermissionServiceProvider.java:38) > > > > > > at > > > de.faktorzehn.ipm.core.services.persistence.JpaPolicyRepository.hasReadPermission(JpaPolicyRepository.java:383) > > > > > > at > > > de.faktorzehn.ipm.core.services.persistence.JpaPolicyRepository.lambda$readPermissionFor$0(JpaPolicyRepository.java:110) > > > > > > at > > > de.faktorzehn.ipm.core.services.persistence.JpaPolicyRepository.internalGetPolicy(JpaPolicyRepository.java:121) > > > > > > at > > > de.faktorzehn.ipm.core.services.persistence.JpaPolicyRepository.getPolicy(JpaPolicyRepository.java:106) > > > > > > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > > > > > > at > > > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) > > > > > > at > > > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > > > > > > at java.lang.reflect.Method.invoke(Method.java:498) > > > > > > at > > > org.apache.webbeans.intercept.AbstractInvocationContext.directProceed(AbstractInvocationContext.java:113) > > > > > > at > > > org.apache.webbeans.intercept.AbstractInvocationContext.proceed(AbstractInvocationContext.java:106) > > > > > > at > > > org.apache.webbeans.intercept.InterceptorInvocationContext.proceed(InterceptorInvocationContext.java:78) > > > > > > at > > > org.apache.openejb.cdi.transactional.InterceptorBase.intercept(InterceptorBase.java:67) > > > > > > at > > > org.apache.openejb.cdi.transactional.RequiredInterceptor.intercept(RequiredInterceptor.java:35) > > > > > > at sun.reflect.GeneratedMethodAccessor25.invoke(Unknown Source) > > > > > > at > > > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > > > > > > at java.lang.reflect.Method.invoke(Method.java:498) > > > > > > at > > > org.apache.webbeans.component.InterceptorBean.intercept(InterceptorBean.java:136) > > > > > > at > > > org.apache.webbeans.intercept.InterceptorInvocationContext.proceed(InterceptorInvocationContext.java:65) > > > > > > at > > > org.apache.webbeans.intercept.DefaultInterceptorHandler.invoke(DefaultInterceptorHandler.java:139) > > > > > > at > > > de.faktorzehn.ipm.core.services.persistence.JpaPolicyRepository$$OwbInterceptProxy1.getPolicy(de/faktorzehn/ipm/core/services/persistence/JpaPolicyRepository.java) > > > > > > at > > > de.faktorzehn.ipm.core.services.persistence.JpaPolicyRepository$$OwbNormalScopeProxy1.getPolicy(de/faktorzehn/ipm/core/services/persistence/JpaPolicyRepository.java) > > > > > > at > > > de.faktorzehn.ipm.core.batch.services.EditPolicyService.getPolicy(EditPolicyService.java:214) > > > > > > at > > > de.faktorzehn.ipm.core.batch.services.EditPolicyService.lambda$editPolicy$2(EditPolicyService.java:89) > > > > > > at > > > de.faktorzehn.ipm.core.batch.services.FailCheckedEditing.withPolicy(FailCheckedEditing.java:236) > > > > > > at > > > de.faktorzehn.ipm.core.batch.services.EditPolicyService.editPolicy(EditPolicyService.java:89) > > > > > > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > > > > > > at > > > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) > > > > > > at > > > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > > > > > > at java.lang.reflect.Method.invoke(Method.java:498) > > > > > > at > > > org.apache.webbeans.intercept.AbstractInvocationContext.directProceed(AbstractInvocationContext.java:113) > > > > > > at > > > org.apache.webbeans.intercept.AbstractInvocationContext.proceed(AbstractInvocationContext.java:106) > > > > > > at > > > org.apache.webbeans.intercept.InterceptorInvocationContext.proceed(InterceptorInvocationContext.java:78) > > > > > > at > > > org.apache.openejb.cdi.transactional.InterceptorBase.intercept(InterceptorBase.java:67) > > > > > > at > > > org.apache.openejb.cdi.transactional.RequiredInterceptor.intercept(RequiredInterceptor.java:35) > > > > > > at sun.reflect.GeneratedMethodAccessor25.invoke(Unknown Source) > > > > > > at > > > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > > > > > > at java.lang.reflect.Method.invoke(Method.java:498) > > > > > > at > > > org.apache.webbeans.component.InterceptorBean.intercept(InterceptorBean.java:136) > > > > > > at > > > org.apache.webbeans.intercept.InterceptorInvocationContext.proceed(InterceptorInvocationContext.java:65) > > > > > > at > > > org.apache.webbeans.intercept.DefaultInterceptorHandler.invoke(DefaultInterceptorHandler.java:139) > > > > > > at > > > de.faktorzehn.ipm.sample.batch.hranpassung.HrAnpassungService$$OwbInterceptProxy1.editPolicy(de/faktorzehn/ipm/sample/batch/hranpassung/HrAnpassungService.java) > > > > > > at > > > de.faktorzehn.ipm.sample.batch.hranpassung.HrAnpassungService$$OwbNormalScopeProxy0.editPolicy(de/faktorzehn/ipm/sample/batch/hranpassung/HrAnpassungService.java) > > > > > > at > > > de.faktorzehn.ipm.core.batch.ParameterizedPolicyWriter.lambda$doWriteItems$0(ParameterizedPolicyWriter.java:59) > > > > > > at > > > java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193) > > > > > > at > > > java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382) > > > > > > at > > > java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481) > > > > > > at > > > java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471) > > > > > > at > > > java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708) > > > > > > at > > > java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) > > > > > > at > > > java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499) > > > > > > at > > > de.faktorzehn.ipm.core.batch.ParameterizedPolicyWriter.doWriteItems(ParameterizedPolicyWriter.java:60) > > > > > > at > > > org.apache.batchee.extras.typed.TypedItemWriter.writeItems(TypedItemWriter.java:35) > > > > > > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > > > > > > at > > > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) > > > > > > at > > > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > > > > > > at java.lang.reflect.Method.invoke(Method.java:498) > > > > > > at > > > org.apache.batchee.container.proxy.BatchProxyInvocationHandler.invoke(BatchProxyInvocationHandler.java:55) > > > > > > at com.sun.proxy.$Proxy204.writeItems(Unknown Source) > > > > > > at > > > org.apache.batchee.container.impl.controller.chunk.ChunkStepController.writeChunk(ChunkStepController.java:433) > > > > > > at > > > org.apache.batchee.container.impl.controller.chunk.ChunkStepController.invokeChunk(ChunkStepController.java:579) > > > > > > at > > > org.apache.batchee.container.impl.controller.chunk.ChunkStepController.invokeCoreStep(ChunkStepController.java:732) > > > > > > at > > > org.apache.batchee.container.impl.controller.BaseStepController.execute(BaseStepController.java:157) > > > > > > at > > > org.apache.batchee.container.impl.controller.ExecutionTransitioner.doExecutionLoop(ExecutionTransitioner.java:106) > > > > > > at > > > org.apache.batchee.container.impl.controller.JobThreadRootController.originateExecutionOnThread(JobThreadRootController.java:110) > > > > > > at > > > org.apache.batchee.container.util.BatchWorkUnit.run(BatchWorkUnit.java:62) > > > > > > at > > > org.apache.batchee.tools.services.thread.ThreadExecutorEjb.executeTask(ThreadExecutorEjb.java:51) > > > > > > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > > > > > > at > > > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) > > > > > > at > > > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > > > > > > at java.lang.reflect.Method.invoke(Method.java:498) > > > > > > at > > > org.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke(ReflectionInvocationContext.java:205) > > > > > > at > > > org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(ReflectionInvocationContext.java:186) > > > > > > at > > > org.apache.openejb.monitoring.StatsInterceptor.record(StatsInterceptor.java:191) > > > > > > at > > > org.apache.openejb.monitoring.StatsInterceptor.invoke(StatsInterceptor.java:102) > > > > > > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > > > > > > at > > > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) > > > > > > at > > > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > > > > > > at java.lang.reflect.Method.invoke(Method.java:498) > > > > > > at > > > org.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke(ReflectionInvocationContext.java:205) > > > > > > at > > > org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(ReflectionInvocationContext.java:186) > > > > > > at > > > org.apache.openejb.core.interceptor.InterceptorStack.invoke(InterceptorStack.java:85) > > > > > > at > > > org.apache.openejb.core.singleton.SingletonContainer._invoke(SingletonContainer.java:272) > > > > > > at > > > org.apache.openejb.core.singleton.SingletonContainer.invoke(SingletonContainer.java:221) > > > > > > at > > > org.apache.openejb.core.ivm.EjbObjectProxyHandler.synchronizedBusinessMethod(EjbObjectProxyHandler.java:265) > > > > > > at > > > org.apache.openejb.core.ivm.EjbObjectProxyHandler$1.call(EjbObjectProxyHandler.java:252) > > > > > > at org.apache.openejb.threads.task.CUTask.invoke(CUTask.java:100) > > > > > > at > > > org.apache.openejb.threads.task.CUCallable.call(CUCallable.java:31) > > > > > > at > > > org.apache.openejb.async.AsynchronousPool$AsynchronousCall.call(AsynchronousPool.java:113) > > > > > > at java.util.concurrent.FutureTask.run(FutureTask.java:266) > > > > > > at > > > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) > > > > > > at > > > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) > > > > > > at java.lang.Thread.run(Thread.java:748) > > > > > > > > > > > > Best Regards > > > > > > > > > > > > > > > Matthias Knappik > > > Senior Developer > > > > > > Faktor Zehn GmbH > > > Friedenheimer Brücke 21 > > > 80639 München > > > > > > Phone +49 89 520311-683 > > > Fax +49 89 520311-8683 > > > Mobile +49 151 582 56644 > > > > > > [email protected] > > > http://www.ConVista.com > > > > > > > > > > > > Faktor Zehn GmbH Sitz der Gesellschaft: München Registernummer: > > > HRB 242535 Registergericht: Amtsgericht München > > > Geschaeftsfuehrung: Dr. Florian Schwandt, Joerg Renger > > > > > > > > ---------------------------------------------------------------------------------- > > > > Faktor Zehn GmbH Sitz der Gesellschaft: Muenchen Registernummer: HRB > > 242535 Registergericht: Amtsgericht Muenchen > > Geschaeftsfuehrung: Dr. Florian Schwandt, Joerg Renger > > >
