[ https://issues.apache.org/jira/browse/CAMEL-20613?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Bartosz Popiela updated CAMEL-20613: ------------------------------------ Description: _java.util.ConcurrentModificationException_ is thrown when a thread modifies org.apache.camel.impl.engine.AbstractCamelContext#endpointStrategies e.g. while creating an instance of a route template / kamelet with {_}interceptSendToEndpoint{_} (see org.apache.camel.reifier.InterceptSendToEndpointReifier#createProcessor) and another thread iterates over this list. There are several methods that iterate over this field (see stacktraces below). A possible fix would be to replace ArrayList with CopyOnWriteArrayList, but there may be a case where a newly added _org.apache.camel.spi.EndpointStrategy_ was not applied to an endpoint that was being created at the same time (currently it is also possible). A more robust solution would be to synchronise all methods that modify or iterate over the list of endpoint strategies in org.apache.camel.impl.engine.AbstractCamelContext (fortunately the field is private and org.apache.camel.impl.engine.AbstractCamelContext#getEndpointStrategies is package-private): - org.apache.camel.impl.engine.AbstractCamelContext#doGetEndpoint - org.apache.camel.impl.engine.AbstractCamelContext#addEndpointToRegistry However, it can slow down the startup of and updates to the Camel context. It may also introduce new deadlock issues. {code:java} org.apache.camel.ResolveEndpointFailedException: Failed to resolve endpoint: kamelet://my-kamelet?someParameter=someValue due to: null at org.apache.camel.impl.engine.AbstractCamelContext.doGetEndpoint(AbstractCamelContext.java:869) at org.apache.camel.impl.engine.DefaultCamelContextExtension.getEndpoint(DefaultCamelContextExtension.java:156) at org.apache.camel.support.CamelContextHelper.getMandatoryEndpoint(CamelContextHelper.java:74) at org.apache.camel.support.ExchangeHelper.resolveEndpoint(ExchangeHelper.java:115) at org.apache.camel.support.ExchangeHelper.resolveEndpoint(ExchangeHelper.java:94) at org.apache.camel.processor.SendDynamicProcessor.resolveEndpoint(SendDynamicProcessor.java:295) at org.apache.camel.processor.SendDynamicProcessor.process(SendDynamicProcessor.java:156) at org.apache.camel.processor.errorhandler.RedeliveryErrorHandler$SimpleTask.run(RedeliveryErrorHandler.java:475) at org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.executeReactiveWork(DefaultReactiveExecutor.java:196) at org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.schedule(DefaultReactiveExecutor.java:164) at org.apache.camel.impl.engine.DefaultReactiveExecutor.schedule(DefaultReactiveExecutor.java:54) at org.apache.camel.processor.MulticastProcessor.lambda$schedule$1(MulticastProcessor.java:369) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:577) at java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:317) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) at java.base/java.lang.Thread.run(Thread.java:1589) Caused by: java.util.ConcurrentModificationException: null at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1013) at java.base/java.util.ArrayList$Itr.next(ArrayList.java:967) at org.apache.camel.impl.engine.AbstractCamelContext.addEndpointToRegistry(AbstractCamelContext.java:911) at org.apache.camel.impl.engine.AbstractCamelContext.doGetEndpoint(AbstractCamelContext.java:855) ... 17 common frames omitted {code} {code:java} org.apache.camel.ResolveEndpointFailedException: Failed to resolve endpoint: kamelet://my-kamelet?someParameter=someValue to: org.apache.camel.component.kamelet.KameletNotFoundException: Kamelet with id my-kamelet not found in locations: classpath:/kamelets at org.apache.camel.impl.engine.AbstractCamelContext.doGetEndpoint(AbstractCamelContext.java:869) at org.apache.camel.impl.engine.DefaultCamelContextExtension.getEndpoint(DefaultCamelContextExtension.java:156) at org.apache.camel.support.CamelContextHelper.getMandatoryEndpoint(CamelContextHelper.java:74) at org.apache.camel.support.ExchangeHelper.resolveEndpoint(ExchangeHelper.java:115) at org.apache.camel.support.ExchangeHelper.resolveEndpoint(ExchangeHelper.java:94) at org.apache.camel.processor.SendDynamicProcessor.resolveEndpoint(SendDynamicProcessor.java:295) at org.apache.camel.processor.SendDynamicProcessor.process(SendDynamicProcessor.java:156) at org.apache.camel.processor.errorhandler.RedeliveryErrorHandler$SimpleTask.run(RedeliveryErrorHandler.java:475) at org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.executeReactiveWork(DefaultReactiveExecutor.java:196) at org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.schedule(DefaultReactiveExecutor.java:164) at org.apache.camel.impl.engine.DefaultReactiveExecutor.schedule(DefaultReactiveExecutor.java:54) at org.apache.camel.processor.MulticastProcessor.lambda$schedule$1(MulticastProcessor.java:369) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:577) at java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:317) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) at java.base/java.lang.Thread.run(Thread.java:1589) Caused by: org.apache.camel.RuntimeCamelException: org.apache.camel.component.kamelet.KameletNotFoundException: Kamelet with id my-kamelet not found in locations: classpath:/kamelets at org.apache.camel.RuntimeCamelException.wrapRuntimeException(RuntimeCamelException.java:66) at org.apache.camel.component.kamelet.KameletComponent$LifecycleHandler.track(KameletComponent.java:450) at org.apache.camel.component.kamelet.KameletComponent$1.doInit(KameletComponent.java:160) at org.apache.camel.support.service.BaseService.init(BaseService.java:78) at org.apache.camel.support.service.ServiceHelper.initService(ServiceHelper.java:84) at org.apache.camel.impl.engine.InternalServiceManager.doAddService(InternalServiceManager.java:121) at org.apache.camel.impl.engine.AbstractCamelContext.addService(AbstractCamelContext.java:1354) at org.apache.camel.impl.engine.AbstractCamelContext.addService(AbstractCamelContext.java:1349) at org.apache.camel.impl.engine.AbstractCamelContext.addService(AbstractCamelContext.java:1344) at org.apache.camel.impl.engine.AbstractCamelContext.doGetEndpoint(AbstractCamelContext.java:853) ... 17 common frames omitted Caused by: org.apache.camel.component.kamelet.KameletNotFoundException: Kamelet with id my-kamelet not found in locations: classpath:/kamelets at org.apache.camel.component.kamelet.KameletComponent$LifecycleHandler.createRouteForEndpoint(KameletComponent.java:421) at org.apache.camel.component.kamelet.KameletComponent$LifecycleHandler.track(KameletComponent.java:448) ... 25 common frames omitted Caused by: java.util.ConcurrentModificationException: null at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1013) at java.base/java.util.ArrayList$Itr.next(ArrayList.java:967) at org.apache.camel.model.RouteDefinitionHelper.prepareRouteForInit(RouteDefinitionHelper.java:307) at org.apache.camel.model.RouteDefinitionHelper.prepareRouteImp(RouteDefinitionHelper.java:392) at org.apache.camel.model.RouteDefinitionHelper.prepareRoute(RouteDefinitionHelper.java:351) at org.apache.camel.model.RoutesDefinition.prepareRoute(RoutesDefinition.java:326) at org.apache.camel.impl.DefaultModel.addRouteFromTemplate(DefaultModel.java:508) at org.apache.camel.impl.DefaultModel.addRouteFromTemplate(DefaultModel.java:366) at org.apache.camel.impl.DefaultCamelContext.addRouteFromTemplate(DefaultCamelContext.java:463) at org.apache.camel.component.kamelet.KameletComponent$LifecycleHandler.createRouteForEndpoint(KameletComponent.java:409) ... 26 common frames omitted {code} {code:java} org.apache.camel.ResolveEndpointFailedException: Failed to resolve endpoint: kamelet://my-kamelet?someParameter=someValue due to: org.apache.camel.component.kamelet.KameletNotFoundException: Kamelet with id my-kamelet not found in locations: classpath:/kamelets at org.apache.camel.impl.engine.AbstractCamelContext.doGetEndpoint(AbstractCamelContext.java:869) at org.apache.camel.impl.engine.DefaultCamelContextExtension.getEndpoint(DefaultCamelContextExtension.java:156) at org.apache.camel.support.CamelContextHelper.getMandatoryEndpoint(CamelContextHelper.java:74) at org.apache.camel.support.ExchangeHelper.resolveEndpoint(ExchangeHelper.java:115) at org.apache.camel.support.ExchangeHelper.resolveEndpoint(ExchangeHelper.java:94) at org.apache.camel.processor.SendDynamicProcessor.resolveEndpoint(SendDynamicProcessor.java:295) at org.apache.camel.processor.SendDynamicProcessor.process(SendDynamicProcessor.java:156) at org.apache.camel.processor.errorhandler.RedeliveryErrorHandler$SimpleTask.run(RedeliveryErrorHandler.java:475) at org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.executeReactiveWork(DefaultReactiveExecutor.java:196) at org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.schedule(DefaultReactiveExecutor.java:164) at org.apache.camel.impl.engine.DefaultReactiveExecutor.schedule(DefaultReactiveExecutor.java:54) at org.apache.camel.processor.MulticastProcessor.lambda$schedule$1(MulticastProcessor.java:369) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:577) at java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:317) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) at java.base/java.lang.Thread.run(Thread.java:1589) Caused by: org.apache.camel.RuntimeCamelException: org.apache.camel.component.kamelet.KameletNotFoundException: Kamelet with id my-kamelet not found in locations: classpath:/kamelets at org.apache.camel.RuntimeCamelException.wrapRuntimeException(RuntimeCamelException.java:66) at org.apache.camel.component.kamelet.KameletComponent$LifecycleHandler.track(KameletComponent.java:450) at org.apache.camel.component.kamelet.KameletComponent$1.doInit(KameletComponent.java:160) at org.apache.camel.support.service.BaseService.init(BaseService.java:78) at org.apache.camel.support.service.ServiceHelper.initService(ServiceHelper.java:84) at org.apache.camel.impl.engine.InternalServiceManager.doAddService(InternalServiceManager.java:121) at org.apache.camel.impl.engine.AbstractCamelContext.addService(AbstractCamelContext.java:1354) at org.apache.camel.impl.engine.AbstractCamelContext.addService(AbstractCamelContext.java:1349) at org.apache.camel.impl.engine.AbstractCamelContext.addService(AbstractCamelContext.java:1344) at org.apache.camel.impl.engine.AbstractCamelContext.doGetEndpoint(AbstractCamelContext.java:853) ... 17 common frames omitted Caused by: org.apache.camel.component.kamelet.KameletNotFoundException: Kamelet with id my-kamelet not found in locations: classpath:/kamelets at org.apache.camel.component.kamelet.KameletComponent$LifecycleHandler.createRouteForEndpoint(KameletComponent.java:421) at org.apache.camel.component.kamelet.KameletComponent$LifecycleHandler.track(KameletComponent.java:448) ... 25 common frames omitted Caused by: java.util.ConcurrentModificationException: null at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1013) at java.base/java.util.ArrayList$Itr.next(ArrayList.java:967) at org.apache.camel.model.RouteDefinitionHelper.validateUniqueIds(RouteDefinitionHelper.java:265) at org.apache.camel.impl.DefaultModel.addRouteFromTemplate(DefaultModel.java:496) at org.apache.camel.impl.DefaultModel.addRouteFromTemplate(DefaultModel.java:366) at org.apache.camel.impl.DefaultCamelContext.addRouteFromTemplate(DefaultCamelContext.java:463) at org.apache.camel.component.kamelet.KameletComponent$LifecycleHandler.createRouteForEndpoint(KameletComponent.java:409) ... 26 common frames omitted {code} was: _java.util.ConcurrentModificationException_ is thrown when a thread modifies org.apache.camel.impl.engine.AbstractCamelContext#endpointStrategies e.g. while creating an instance of a route template / kamelet with {_}interceptSendToEndpoint{_} (see org.apache.camel.reifier.InterceptSendToEndpointReifier#createProcessor) and another thread iterates over this list. There are several methods that iterate over this field (see stacktraces below). A possible fix would be to replace ArrayList with CopyOnWriteArrayList, but there may be a case where a newly added org.apache.camel.spi.EndpointStrategy was not applied to an endpoint that is being created at the same time (currently it is also possible). A more robust solution would be to synchronise all methods that modify or iterate over the list of endpoint strategies in org.apache.camel.impl.engine.AbstractCamelContext (fortunately the field is private and org.apache.camel.impl.engine.AbstractCamelContext#getEndpointStrategies is package-private): - org.apache.camel.impl.engine.AbstractCamelContext#doGetEndpoint - org.apache.camel.impl.engine.AbstractCamelContext#addEndpointToRegistry However, it can slow down the startup and updates of the Camel context. It may also introduce new deadlock issues. PFA a pull request with the latter solution. {code:java} org.apache.camel.ResolveEndpointFailedException: Failed to resolve endpoint: kamelet://my-kamelet?someParameter=someValue due to: null at org.apache.camel.impl.engine.AbstractCamelContext.doGetEndpoint(AbstractCamelContext.java:869) at org.apache.camel.impl.engine.DefaultCamelContextExtension.getEndpoint(DefaultCamelContextExtension.java:156) at org.apache.camel.support.CamelContextHelper.getMandatoryEndpoint(CamelContextHelper.java:74) at org.apache.camel.support.ExchangeHelper.resolveEndpoint(ExchangeHelper.java:115) at org.apache.camel.support.ExchangeHelper.resolveEndpoint(ExchangeHelper.java:94) at org.apache.camel.processor.SendDynamicProcessor.resolveEndpoint(SendDynamicProcessor.java:295) at org.apache.camel.processor.SendDynamicProcessor.process(SendDynamicProcessor.java:156) at org.apache.camel.processor.errorhandler.RedeliveryErrorHandler$SimpleTask.run(RedeliveryErrorHandler.java:475) at org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.executeReactiveWork(DefaultReactiveExecutor.java:196) at org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.schedule(DefaultReactiveExecutor.java:164) at org.apache.camel.impl.engine.DefaultReactiveExecutor.schedule(DefaultReactiveExecutor.java:54) at org.apache.camel.processor.MulticastProcessor.lambda$schedule$1(MulticastProcessor.java:369) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:577) at java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:317) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) at java.base/java.lang.Thread.run(Thread.java:1589) Caused by: java.util.ConcurrentModificationException: null at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1013) at java.base/java.util.ArrayList$Itr.next(ArrayList.java:967) at org.apache.camel.impl.engine.AbstractCamelContext.addEndpointToRegistry(AbstractCamelContext.java:911) at org.apache.camel.impl.engine.AbstractCamelContext.doGetEndpoint(AbstractCamelContext.java:855) ... 17 common frames omitted {code} {code:java} org.apache.camel.ResolveEndpointFailedException: Failed to resolve endpoint: kamelet://my-kamelet?someParameter=someValue to: org.apache.camel.component.kamelet.KameletNotFoundException: Kamelet with id my-kamelet not found in locations: classpath:/kamelets at org.apache.camel.impl.engine.AbstractCamelContext.doGetEndpoint(AbstractCamelContext.java:869) at org.apache.camel.impl.engine.DefaultCamelContextExtension.getEndpoint(DefaultCamelContextExtension.java:156) at org.apache.camel.support.CamelContextHelper.getMandatoryEndpoint(CamelContextHelper.java:74) at org.apache.camel.support.ExchangeHelper.resolveEndpoint(ExchangeHelper.java:115) at org.apache.camel.support.ExchangeHelper.resolveEndpoint(ExchangeHelper.java:94) at org.apache.camel.processor.SendDynamicProcessor.resolveEndpoint(SendDynamicProcessor.java:295) at org.apache.camel.processor.SendDynamicProcessor.process(SendDynamicProcessor.java:156) at org.apache.camel.processor.errorhandler.RedeliveryErrorHandler$SimpleTask.run(RedeliveryErrorHandler.java:475) at org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.executeReactiveWork(DefaultReactiveExecutor.java:196) at org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.schedule(DefaultReactiveExecutor.java:164) at org.apache.camel.impl.engine.DefaultReactiveExecutor.schedule(DefaultReactiveExecutor.java:54) at org.apache.camel.processor.MulticastProcessor.lambda$schedule$1(MulticastProcessor.java:369) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:577) at java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:317) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) at java.base/java.lang.Thread.run(Thread.java:1589) Caused by: org.apache.camel.RuntimeCamelException: org.apache.camel.component.kamelet.KameletNotFoundException: Kamelet with id my-kamelet not found in locations: classpath:/kamelets at org.apache.camel.RuntimeCamelException.wrapRuntimeException(RuntimeCamelException.java:66) at org.apache.camel.component.kamelet.KameletComponent$LifecycleHandler.track(KameletComponent.java:450) at org.apache.camel.component.kamelet.KameletComponent$1.doInit(KameletComponent.java:160) at org.apache.camel.support.service.BaseService.init(BaseService.java:78) at org.apache.camel.support.service.ServiceHelper.initService(ServiceHelper.java:84) at org.apache.camel.impl.engine.InternalServiceManager.doAddService(InternalServiceManager.java:121) at org.apache.camel.impl.engine.AbstractCamelContext.addService(AbstractCamelContext.java:1354) at org.apache.camel.impl.engine.AbstractCamelContext.addService(AbstractCamelContext.java:1349) at org.apache.camel.impl.engine.AbstractCamelContext.addService(AbstractCamelContext.java:1344) at org.apache.camel.impl.engine.AbstractCamelContext.doGetEndpoint(AbstractCamelContext.java:853) ... 17 common frames omitted Caused by: org.apache.camel.component.kamelet.KameletNotFoundException: Kamelet with id my-kamelet not found in locations: classpath:/kamelets at org.apache.camel.component.kamelet.KameletComponent$LifecycleHandler.createRouteForEndpoint(KameletComponent.java:421) at org.apache.camel.component.kamelet.KameletComponent$LifecycleHandler.track(KameletComponent.java:448) ... 25 common frames omitted Caused by: java.util.ConcurrentModificationException: null at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1013) at java.base/java.util.ArrayList$Itr.next(ArrayList.java:967) at org.apache.camel.model.RouteDefinitionHelper.prepareRouteForInit(RouteDefinitionHelper.java:307) at org.apache.camel.model.RouteDefinitionHelper.prepareRouteImp(RouteDefinitionHelper.java:392) at org.apache.camel.model.RouteDefinitionHelper.prepareRoute(RouteDefinitionHelper.java:351) at org.apache.camel.model.RoutesDefinition.prepareRoute(RoutesDefinition.java:326) at org.apache.camel.impl.DefaultModel.addRouteFromTemplate(DefaultModel.java:508) at org.apache.camel.impl.DefaultModel.addRouteFromTemplate(DefaultModel.java:366) at org.apache.camel.impl.DefaultCamelContext.addRouteFromTemplate(DefaultCamelContext.java:463) at org.apache.camel.component.kamelet.KameletComponent$LifecycleHandler.createRouteForEndpoint(KameletComponent.java:409) ... 26 common frames omitted {code} {code:java} org.apache.camel.ResolveEndpointFailedException: Failed to resolve endpoint: kamelet://my-kamelet?someParameter=someValue due to: org.apache.camel.component.kamelet.KameletNotFoundException: Kamelet with id my-kamelet not found in locations: classpath:/kamelets at org.apache.camel.impl.engine.AbstractCamelContext.doGetEndpoint(AbstractCamelContext.java:869) at org.apache.camel.impl.engine.DefaultCamelContextExtension.getEndpoint(DefaultCamelContextExtension.java:156) at org.apache.camel.support.CamelContextHelper.getMandatoryEndpoint(CamelContextHelper.java:74) at org.apache.camel.support.ExchangeHelper.resolveEndpoint(ExchangeHelper.java:115) at org.apache.camel.support.ExchangeHelper.resolveEndpoint(ExchangeHelper.java:94) at org.apache.camel.processor.SendDynamicProcessor.resolveEndpoint(SendDynamicProcessor.java:295) at org.apache.camel.processor.SendDynamicProcessor.process(SendDynamicProcessor.java:156) at org.apache.camel.processor.errorhandler.RedeliveryErrorHandler$SimpleTask.run(RedeliveryErrorHandler.java:475) at org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.executeReactiveWork(DefaultReactiveExecutor.java:196) at org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.schedule(DefaultReactiveExecutor.java:164) at org.apache.camel.impl.engine.DefaultReactiveExecutor.schedule(DefaultReactiveExecutor.java:54) at org.apache.camel.processor.MulticastProcessor.lambda$schedule$1(MulticastProcessor.java:369) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:577) at java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:317) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) at java.base/java.lang.Thread.run(Thread.java:1589) Caused by: org.apache.camel.RuntimeCamelException: org.apache.camel.component.kamelet.KameletNotFoundException: Kamelet with id my-kamelet not found in locations: classpath:/kamelets at org.apache.camel.RuntimeCamelException.wrapRuntimeException(RuntimeCamelException.java:66) at org.apache.camel.component.kamelet.KameletComponent$LifecycleHandler.track(KameletComponent.java:450) at org.apache.camel.component.kamelet.KameletComponent$1.doInit(KameletComponent.java:160) at org.apache.camel.support.service.BaseService.init(BaseService.java:78) at org.apache.camel.support.service.ServiceHelper.initService(ServiceHelper.java:84) at org.apache.camel.impl.engine.InternalServiceManager.doAddService(InternalServiceManager.java:121) at org.apache.camel.impl.engine.AbstractCamelContext.addService(AbstractCamelContext.java:1354) at org.apache.camel.impl.engine.AbstractCamelContext.addService(AbstractCamelContext.java:1349) at org.apache.camel.impl.engine.AbstractCamelContext.addService(AbstractCamelContext.java:1344) at org.apache.camel.impl.engine.AbstractCamelContext.doGetEndpoint(AbstractCamelContext.java:853) ... 17 common frames omitted Caused by: org.apache.camel.component.kamelet.KameletNotFoundException: Kamelet with id my-kamelet not found in locations: classpath:/kamelets at org.apache.camel.component.kamelet.KameletComponent$LifecycleHandler.createRouteForEndpoint(KameletComponent.java:421) at org.apache.camel.component.kamelet.KameletComponent$LifecycleHandler.track(KameletComponent.java:448) ... 25 common frames omitted Caused by: java.util.ConcurrentModificationException: null at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1013) at java.base/java.util.ArrayList$Itr.next(ArrayList.java:967) at org.apache.camel.model.RouteDefinitionHelper.validateUniqueIds(RouteDefinitionHelper.java:265) at org.apache.camel.impl.DefaultModel.addRouteFromTemplate(DefaultModel.java:496) at org.apache.camel.impl.DefaultModel.addRouteFromTemplate(DefaultModel.java:366) at org.apache.camel.impl.DefaultCamelContext.addRouteFromTemplate(DefaultCamelContext.java:463) at org.apache.camel.component.kamelet.KameletComponent$LifecycleHandler.createRouteForEndpoint(KameletComponent.java:409) ... 26 common frames omitted {code} > ConcurrentModificationException > ------------------------------- > > Key: CAMEL-20613 > URL: https://issues.apache.org/jira/browse/CAMEL-20613 > Project: Camel > Issue Type: Bug > Components: camel-core > Affects Versions: 3.22.1, 4.4.1 > Reporter: Bartosz Popiela > Priority: Major > > _java.util.ConcurrentModificationException_ is thrown when a thread modifies > org.apache.camel.impl.engine.AbstractCamelContext#endpointStrategies e.g. > while creating an instance of a route template / kamelet with > {_}interceptSendToEndpoint{_} (see > org.apache.camel.reifier.InterceptSendToEndpointReifier#createProcessor) and > another thread iterates over this list. There are several methods that > iterate over this field (see stacktraces below). > A possible fix would be to replace ArrayList with CopyOnWriteArrayList, but > there may be a case where a newly added > _org.apache.camel.spi.EndpointStrategy_ was not applied to an endpoint that > was being created at the same time (currently it is also possible). A more > robust solution would be to synchronise all methods that modify or iterate > over the list of endpoint strategies in > org.apache.camel.impl.engine.AbstractCamelContext (fortunately the field is > private and > org.apache.camel.impl.engine.AbstractCamelContext#getEndpointStrategies is > package-private): > - org.apache.camel.impl.engine.AbstractCamelContext#doGetEndpoint > - org.apache.camel.impl.engine.AbstractCamelContext#addEndpointToRegistry > However, it can slow down the startup of and updates to the Camel context. It > may also introduce new deadlock issues. > {code:java} > org.apache.camel.ResolveEndpointFailedException: Failed to resolve endpoint: > kamelet://my-kamelet?someParameter=someValue due to: null > at > org.apache.camel.impl.engine.AbstractCamelContext.doGetEndpoint(AbstractCamelContext.java:869) > at > org.apache.camel.impl.engine.DefaultCamelContextExtension.getEndpoint(DefaultCamelContextExtension.java:156) > at > org.apache.camel.support.CamelContextHelper.getMandatoryEndpoint(CamelContextHelper.java:74) > at > org.apache.camel.support.ExchangeHelper.resolveEndpoint(ExchangeHelper.java:115) > at > org.apache.camel.support.ExchangeHelper.resolveEndpoint(ExchangeHelper.java:94) > at > org.apache.camel.processor.SendDynamicProcessor.resolveEndpoint(SendDynamicProcessor.java:295) > at > org.apache.camel.processor.SendDynamicProcessor.process(SendDynamicProcessor.java:156) > at > org.apache.camel.processor.errorhandler.RedeliveryErrorHandler$SimpleTask.run(RedeliveryErrorHandler.java:475) > at > org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.executeReactiveWork(DefaultReactiveExecutor.java:196) > at > org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.schedule(DefaultReactiveExecutor.java:164) > at > org.apache.camel.impl.engine.DefaultReactiveExecutor.schedule(DefaultReactiveExecutor.java:54) > at > org.apache.camel.processor.MulticastProcessor.lambda$schedule$1(MulticastProcessor.java:369) > at > java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:577) > at > java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:317) > at java.base/java.util.concurrent.FutureTask.run(FutureTask.java) > at > java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) > at > java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) > at java.base/java.lang.Thread.run(Thread.java:1589) > Caused by: java.util.ConcurrentModificationException: null > at > java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1013) > at java.base/java.util.ArrayList$Itr.next(ArrayList.java:967) > at > org.apache.camel.impl.engine.AbstractCamelContext.addEndpointToRegistry(AbstractCamelContext.java:911) > at > org.apache.camel.impl.engine.AbstractCamelContext.doGetEndpoint(AbstractCamelContext.java:855) > ... 17 common frames omitted > {code} > {code:java} > org.apache.camel.ResolveEndpointFailedException: Failed to resolve endpoint: > kamelet://my-kamelet?someParameter=someValue to: > org.apache.camel.component.kamelet.KameletNotFoundException: Kamelet with id > my-kamelet not found in locations: classpath:/kamelets > at > org.apache.camel.impl.engine.AbstractCamelContext.doGetEndpoint(AbstractCamelContext.java:869) > at > org.apache.camel.impl.engine.DefaultCamelContextExtension.getEndpoint(DefaultCamelContextExtension.java:156) > at > org.apache.camel.support.CamelContextHelper.getMandatoryEndpoint(CamelContextHelper.java:74) > at > org.apache.camel.support.ExchangeHelper.resolveEndpoint(ExchangeHelper.java:115) > at > org.apache.camel.support.ExchangeHelper.resolveEndpoint(ExchangeHelper.java:94) > at > org.apache.camel.processor.SendDynamicProcessor.resolveEndpoint(SendDynamicProcessor.java:295) > at > org.apache.camel.processor.SendDynamicProcessor.process(SendDynamicProcessor.java:156) > at > org.apache.camel.processor.errorhandler.RedeliveryErrorHandler$SimpleTask.run(RedeliveryErrorHandler.java:475) > at > org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.executeReactiveWork(DefaultReactiveExecutor.java:196) > at > org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.schedule(DefaultReactiveExecutor.java:164) > at > org.apache.camel.impl.engine.DefaultReactiveExecutor.schedule(DefaultReactiveExecutor.java:54) > at > org.apache.camel.processor.MulticastProcessor.lambda$schedule$1(MulticastProcessor.java:369) > at > java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:577) > at > java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:317) > at java.base/java.util.concurrent.FutureTask.run(FutureTask.java) > at > java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) > at > java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) > at java.base/java.lang.Thread.run(Thread.java:1589) > Caused by: org.apache.camel.RuntimeCamelException: > org.apache.camel.component.kamelet.KameletNotFoundException: Kamelet with id > my-kamelet not found in locations: classpath:/kamelets > at > org.apache.camel.RuntimeCamelException.wrapRuntimeException(RuntimeCamelException.java:66) > at > org.apache.camel.component.kamelet.KameletComponent$LifecycleHandler.track(KameletComponent.java:450) > at > org.apache.camel.component.kamelet.KameletComponent$1.doInit(KameletComponent.java:160) > at > org.apache.camel.support.service.BaseService.init(BaseService.java:78) > at > org.apache.camel.support.service.ServiceHelper.initService(ServiceHelper.java:84) > at > org.apache.camel.impl.engine.InternalServiceManager.doAddService(InternalServiceManager.java:121) > at > org.apache.camel.impl.engine.AbstractCamelContext.addService(AbstractCamelContext.java:1354) > at > org.apache.camel.impl.engine.AbstractCamelContext.addService(AbstractCamelContext.java:1349) > at > org.apache.camel.impl.engine.AbstractCamelContext.addService(AbstractCamelContext.java:1344) > at > org.apache.camel.impl.engine.AbstractCamelContext.doGetEndpoint(AbstractCamelContext.java:853) > ... 17 common frames omitted > Caused by: org.apache.camel.component.kamelet.KameletNotFoundException: > Kamelet with id my-kamelet not found in locations: classpath:/kamelets > at > org.apache.camel.component.kamelet.KameletComponent$LifecycleHandler.createRouteForEndpoint(KameletComponent.java:421) > at > org.apache.camel.component.kamelet.KameletComponent$LifecycleHandler.track(KameletComponent.java:448) > ... 25 common frames omitted > Caused by: java.util.ConcurrentModificationException: null > at > java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1013) > at java.base/java.util.ArrayList$Itr.next(ArrayList.java:967) > at > org.apache.camel.model.RouteDefinitionHelper.prepareRouteForInit(RouteDefinitionHelper.java:307) > at > org.apache.camel.model.RouteDefinitionHelper.prepareRouteImp(RouteDefinitionHelper.java:392) > at > org.apache.camel.model.RouteDefinitionHelper.prepareRoute(RouteDefinitionHelper.java:351) > at > org.apache.camel.model.RoutesDefinition.prepareRoute(RoutesDefinition.java:326) > at > org.apache.camel.impl.DefaultModel.addRouteFromTemplate(DefaultModel.java:508) > at > org.apache.camel.impl.DefaultModel.addRouteFromTemplate(DefaultModel.java:366) > at > org.apache.camel.impl.DefaultCamelContext.addRouteFromTemplate(DefaultCamelContext.java:463) > at > org.apache.camel.component.kamelet.KameletComponent$LifecycleHandler.createRouteForEndpoint(KameletComponent.java:409) > ... 26 common frames omitted > {code} > {code:java} > org.apache.camel.ResolveEndpointFailedException: Failed to resolve endpoint: > kamelet://my-kamelet?someParameter=someValue due to: > org.apache.camel.component.kamelet.KameletNotFoundException: Kamelet with id > my-kamelet not found in locations: classpath:/kamelets > at > org.apache.camel.impl.engine.AbstractCamelContext.doGetEndpoint(AbstractCamelContext.java:869) > at > org.apache.camel.impl.engine.DefaultCamelContextExtension.getEndpoint(DefaultCamelContextExtension.java:156) > at > org.apache.camel.support.CamelContextHelper.getMandatoryEndpoint(CamelContextHelper.java:74) > at > org.apache.camel.support.ExchangeHelper.resolveEndpoint(ExchangeHelper.java:115) > at > org.apache.camel.support.ExchangeHelper.resolveEndpoint(ExchangeHelper.java:94) > at > org.apache.camel.processor.SendDynamicProcessor.resolveEndpoint(SendDynamicProcessor.java:295) > at > org.apache.camel.processor.SendDynamicProcessor.process(SendDynamicProcessor.java:156) > at > org.apache.camel.processor.errorhandler.RedeliveryErrorHandler$SimpleTask.run(RedeliveryErrorHandler.java:475) > at > org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.executeReactiveWork(DefaultReactiveExecutor.java:196) > at > org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.schedule(DefaultReactiveExecutor.java:164) > at > org.apache.camel.impl.engine.DefaultReactiveExecutor.schedule(DefaultReactiveExecutor.java:54) > at > org.apache.camel.processor.MulticastProcessor.lambda$schedule$1(MulticastProcessor.java:369) > at > java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:577) > at > java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:317) > at java.base/java.util.concurrent.FutureTask.run(FutureTask.java) > at > java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) > at > java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) > at java.base/java.lang.Thread.run(Thread.java:1589) > Caused by: org.apache.camel.RuntimeCamelException: > org.apache.camel.component.kamelet.KameletNotFoundException: Kamelet with id > my-kamelet not found in locations: classpath:/kamelets > at > org.apache.camel.RuntimeCamelException.wrapRuntimeException(RuntimeCamelException.java:66) > at > org.apache.camel.component.kamelet.KameletComponent$LifecycleHandler.track(KameletComponent.java:450) > at > org.apache.camel.component.kamelet.KameletComponent$1.doInit(KameletComponent.java:160) > at > org.apache.camel.support.service.BaseService.init(BaseService.java:78) > at > org.apache.camel.support.service.ServiceHelper.initService(ServiceHelper.java:84) > at > org.apache.camel.impl.engine.InternalServiceManager.doAddService(InternalServiceManager.java:121) > at > org.apache.camel.impl.engine.AbstractCamelContext.addService(AbstractCamelContext.java:1354) > at > org.apache.camel.impl.engine.AbstractCamelContext.addService(AbstractCamelContext.java:1349) > at > org.apache.camel.impl.engine.AbstractCamelContext.addService(AbstractCamelContext.java:1344) > at > org.apache.camel.impl.engine.AbstractCamelContext.doGetEndpoint(AbstractCamelContext.java:853) > ... 17 common frames omitted > Caused by: org.apache.camel.component.kamelet.KameletNotFoundException: > Kamelet with id my-kamelet not found in locations: classpath:/kamelets > at > org.apache.camel.component.kamelet.KameletComponent$LifecycleHandler.createRouteForEndpoint(KameletComponent.java:421) > at > org.apache.camel.component.kamelet.KameletComponent$LifecycleHandler.track(KameletComponent.java:448) > ... 25 common frames omitted > Caused by: java.util.ConcurrentModificationException: null > at > java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1013) > at java.base/java.util.ArrayList$Itr.next(ArrayList.java:967) > at > org.apache.camel.model.RouteDefinitionHelper.validateUniqueIds(RouteDefinitionHelper.java:265) > at > org.apache.camel.impl.DefaultModel.addRouteFromTemplate(DefaultModel.java:496) > at > org.apache.camel.impl.DefaultModel.addRouteFromTemplate(DefaultModel.java:366) > at > org.apache.camel.impl.DefaultCamelContext.addRouteFromTemplate(DefaultCamelContext.java:463) > at > org.apache.camel.component.kamelet.KameletComponent$LifecycleHandler.createRouteForEndpoint(KameletComponent.java:409) > ... 26 common frames omitted > {code} -- This message was sent by Atlassian Jira (v8.20.10#820010)