0

I have a class which creates the camel routes dynamically. Previously it creates routes through a simple loop, But now I want to make sure all routes are start at the same time. For that I used FutureTask. Now I got the exception,

java.lang.UnsupportedOperationException: JBAS011859: Naming context is read-only

There is a JNDI registry used in CreateCamelRoute class. whenever trying to bind object to that, it throws the exception. How can I make JNDI Registry thread safe?

public StartRoutes(){
           List<DestinationTransport> transport = findAll();

            FutureTask[] randomNumberTasks = new FutureTask[transport.size()];

            for (int i = 0; i < transport.size(); i++) {
                Callable callable = new CallableExampleDT(transport.get(i));

                randomNumberTasks[i] = new FutureTask(callable);

                Thread t = new Thread(randomNumberTasks[i]);
                t.start();
            }

            for (int i = 0; i < transport.size(); i++) {
                System.out.println(randomNumberTasks[i].get());
                messages.add((String) randomNumberTasks[i].get());
            }
        }
}

CallableExampleDT

public class CallableExampleDT implements Callable<Object> {
    private final Object transport;

    public CallableExampleDT(Object transport) {
       this.transport = transport;
    }

public synchronized Object call() throws Exception {

    String status = "";
    DestinationTransport t= (DestinationTransport) transport;
    try {
            route.createRoute(t);
    } catch (Exception e) {
        e.printStackTrace();
    }

    Thread.sleep(5000);


    if (route.checkRoute(t.id()))
        status= LoggingMessage.STARTED;
    else
        status= LoggingMessage.IS_STOPPED;

    return status;
}

AsyncCamelDynamicFTPRoute

public class AsyncCamelDynamicFTPRoute{

    DefaultCamelContext defaultCamelContext = null;

    private CamelContext context = null;

    JndiRegistry jndi = new JndiRegistry();

    public synchronized void createRoute(Object object) throws ApplicationException {
        DestinationTransport dt= (DestinationTransport) object;
        String destinationTransport= dt.id();


        if(Objects.isNull(jndi.lookupByName("DYNAMIC_QUEUES_"+dt.getDestinationTransport()))){
            defaultCamelContext = new DefaultCamelContext();
            defaultCamelContext.setName("DYNAMIC_QUEUES_"+dt.getDestinationTransport());

            //getting exception here, while trying to bind
            jndi.bind("DYNAMIC_QUEUES_"+dt.getDestinationTransport(), defaultCamelContext);

        }
        else {

                defaultCamelContext = (DefaultCamelContext) jndi.lookup("DYNAMIC_QUEUES_"+dt.getDestinationTransport());

        }
        context= defaultCamelContext;

        context.getProperties().put(Exchange.LOG_DEBUG_BODY_STREAMS, "true");

            context.addRoutes(new RouteBuilder() {
                    /**Code for creating route**/
           }

      context.start();

 }

Log

ERROR [stderr] (Thread-89) java.lang.UnsupportedOperationException: JBAS011859: Naming context is read-only
01:26:57,536 ERROR [stderr] (Thread-89)     at org.jboss.as.naming.WritableServiceBasedNamingStore.requireOwner(WritableServiceBasedNamingStore.java:161)
01:26:57,536 ERROR [stderr] (Thread-89)     at org.jboss.as.naming.WritableServiceBasedNamingStore.bind(WritableServiceBasedNamingStore.java:66)
01:26:57,536 ERROR [stderr] (Thread-89)     at org.jboss.as.naming.NamingContext.bind(NamingContext.java:253)
01:26:57,537 ERROR [stderr] (Thread-89)     at org.jboss.as.naming.InitialContext$DefaultInitialContext.bind(InitialContext.java:260)
01:26:57,537 ERROR [stderr] (Thread-89)     at org.jboss.as.naming.NamingContext.bind(NamingContext.java:262)
01:26:57,537 ERROR [stderr] (Thread-89)     at javax.naming.InitialContext.bind(InitialContext.java:425)
01:26:57,537 ERROR [stderr] (Thread-89)     at javax.naming.InitialContext.bind(InitialContext.java:425)
01:26:57,537 ERROR [stderr] (Thread-89)     at org.apache.camel.impl.JndiRegistry.bind(JndiRegistry.java:124)
01:26:57,537 ERROR [stderr] (Thread-89)     at com.sial.integration.routing.AsyncCamelDynamicFTPRoute.createRoute(AsyncCamelDynamicFTPRoute.java:91)
01:26:57,537 ERROR [stderr] (Thread-89)     at com.sial.integration.routing.AsyncCamelDynamicFTPRoute$Proxy$_$$_WeldClientProxy.createRoute(Unknown Source)
01:26:57,537 ERROR [stderr] (Thread-89)     at com.sial.integration.api.CallableExampleDT.call(CallableExampleDT.java:27)
01:26:57,537 ERROR [stderr] (Thread-89)     at java.util.concurrent.FutureTask.run(FutureTask.java:266)
01:26:57,537 ERROR [stderr] (Thread-89)     at java.lang.Thread.run(Thread.java:745)
Draken
  • 3,134
  • 13
  • 34
  • 54
MKRISH
  • 21
  • 5
  • At first glance, It looks like your code is already thread-protected. The `createRoute` method is marked as `synchronized`. – Yossi Vainshtein Oct 08 '18 at 06:53
  • Did you see this thread? https://stackoverflow.com/questions/26675905/jboss-wildfly-with-jersey-web-services-deployment-error-jbas011859-naming-conte – Yossi Vainshtein Oct 08 '18 at 06:55
  • Yeah already added synchronized but not working. And even am setting **set "JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.jersey.server.impl.cdi.lookupExtensionInBeanManager=true"** , it wont work for me – MKRISH Oct 08 '18 at 07:26

0 Answers0