You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@camel.apache.org by Bob Paulin <bo...@bobpaulin.com> on 2017/11/04 03:16:11 UTC

Should addRoutes be synchronized?

Hi,

I've recently hit an issue with using DefaultCamelContext addRoutes /
removeRouteDefinitions within a dynamic environment (routes are adding
and removed at runtime).  It seems that the removeRouteDefinitions is
synchronized however the addRoutes is not.  On occasion has produced the
the ConcurrentModificationException [1].  I've solved it in my client
code by surrounding the calls to adding and removing with synchronized
blocks [2], however it might be safer to simply synchronize addRoutes
[3].  Thoughts?


- Bob

[1]

2017-11-02 22:57:12,205 | ERROR | Thread-7         |
Activator                        | 20 -
com.myclient.api.myclient-api-core - 1.0.411 | Error Adding Camel Route
Builder
java.util.ConcurrentModificationException
    at
java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)[:1.8.0_131]
    at java.util.ArrayList$Itr.next(ArrayList.java:851)[:1.8.0_131]
    at
org.apache.camel.builder.RouteBuilder.populateRests(RouteBuilder.java:454)[82:org.apache.camel.camel-core:2.18.4]
    at
org.apache.camel.builder.RouteBuilder.addRoutesToCamelContext(RouteBuilder.java:330)[82:org.apache.camel.camel-core:2.18.4]
    at
org.apache.camel.impl.DefaultCamelContext$1.call(DefaultCamelContext.java:916)[82:org.apache.camel.camel-core:2.18.4]
    at
org.apache.camel.impl.DefaultCamelContext$1.call(DefaultCamelContext.java:913)[82:org.apache.camel.camel-core:2.18.4]
    at
org.apache.camel.impl.DefaultCamelContext.doWithDefinedClassLoader(DefaultCamelContext.java:3027)[82:org.apache.camel.camel-core:2.18.4]
    at
org.apache.camel.impl.DefaultCamelContext.addRoutes(DefaultCamelContext.java:913)[82:org.apache.camel.camel-core:2.18.4]
    at
com.myclient.api.internal.Activator.addingService(Activator.java:136)[20:com.myclient.api.myclient-api-core:1.0.411]
    at
com.myclient.api.internal.Activator.addingService(Activator.java:45)[20:com.myclient.api.myclient-api-core:1.0.411]
   ...

[2]

synchronized(camelContext)
 {
                this.camelContext.addRoutes(builder);
 }

[3]

public synchronized void addRoutes(final RoutesBuilder builder) throws
Exception