Hey guys, question about some camel functionality.

Java version: jdk1.8.0_152
Karaf version: 4.3.2   (I also tested 4.3.7, and it has the same odd behavior)
Camel version: 3.11.0  (I also tested 3.14.0, and it has the same odd behavior)

In a clean karaf install, I created two different bundles. TestService1 and 
TestService2.
TestService1 sends message to TestService2, then TestService2 uses 
producerTemplate to hit a route on TestService1.

That producerTemplate call appears to get stuck forever on an internal block.
If I do the same call without using producerTemplate (aka with to() or 
Recipient List), it works fine.

This did work in karaf 4.1.5 & camel 2.21.0, but appears to have stopped 
functioning when I tried the versions stated above.
I guess my question here is, is this a bug? Or is this some sort of 
functionality to prevent looping routes.
It only seems to happen if it's two separate bundles (and thus separate camel 
contexts) so I'd guess this is a bug, but I'm unsure.

If anyone happens to know any way around this possible issue as well, that'd be 
great to know.
The only ways I've found is calling producerTemplate in a new thread (not a 
good solution), or just outright avoiding the use of producerTemplate (even 
worse solution).


Stack trace when I forcibly killed the thread:
========================

Caused by: java.lang.InterruptedException
    at 
java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:998)
    at 
java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1304)
    at java.util.concurrent.CountDownLatch.await(CountDownLatch.java:231)
    at 
org.apache.camel.impl.engine.DefaultAsyncProcessorAwaitManager.await(DefaultAsyncProcessorAwaitManager.java:107)
    at 
org.apache.camel.impl.engine.DefaultAsyncProcessorAwaitManager.process(DefaultAsyncProcessorAwaitManager.java:85)
    at 
org.apache.camel.impl.engine.SharedCamelInternalProcessor.process(SharedCamelInternalProcessor.java:108)
    at 
org.apache.camel.support.cache.DefaultProducerCache.send(DefaultProducerCache.java:190)
    at 
org.apache.camel.impl.engine.DefaultProducerTemplate.send(DefaultProducerTemplate.java:176)
    at 
org.apache.camel.impl.engine.DefaultProducerTemplate.send(DefaultProducerTemplate.java:172)
    at 
org.apache.camel.impl.engine.DefaultProducerTemplate.send(DefaultProducerTemplate.java:137)

Code:
========================

classes:

public class TestService1 extends RouteBuilder {

    private static final Logger logger = 
LoggerFactory.getLogger(TestService1.class);

    public static final String TEST_SERVICE2_ROUTE = 
"direct-vm://testService2Route";
    public static final String TEST_SERVICE1_RETURN_ROUTE = 
"direct-vm://testService1ReturnRoute";

    @Override
    public void configure() throws Exception {

        // On startup, send message to second jar/camel context
        from("timer://startup?repeatCount=1&delay=30s")
            .routeId("startup")
            .to(TEST_SERVICE2_ROUTE);

        // Listens for return call from second jar
        from(TEST_SERVICE1_RETURN_ROUTE).routeId("testService1ReturnRoute")
            .bean(this, "returnedMethod");
    }

    public void returnedMethod() {
        logger.info("Made it back to the first jar!!!!!!!");
    }

}

public class TestService2 extends RouteBuilder {

    private static final Logger logger = 
LoggerFactory.getLogger(TestService2.class);

    public static final String TEST_SERVICE2_ROUTE = 
"direct-vm://testService2Route";
    public static final String TEST_SERVICE1_RETURN_ROUTE = 
"direct-vm://testService1ReturnRoute";

    @Produce(TEST_SERVICE1_RETURN_ROUTE)
    ProducerTemplate executor;

    @Override
    public void configure() throws Exception {

        //listens for a call from service 1, then hits a route in service 1
        from(TEST_SERVICE2_ROUTE).routeId("testService2Route")
            .bean(this, "hitService1");

    }

    public void hitService1() {
        logger.info("This call gets locked up");
        executor.sendBody("hello");
    }

}


blueprints:


<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0";
    xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0";
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
           xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 
http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd";>

    <bean id="testService2" class="com.example.test2.TestService2"></bean>

    <!-- Camel -->
    <camelContext id="camel" xmlns="http://camel.apache.org/schema/blueprint";>
        <routeBuilder ref="testService2"/>
    </camelContext>

</blueprint>

<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0";
    xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0";
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
           xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 
http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd";>

    <bean id="testService1" class="com.example.test1.TestService1"></bean>

    <!-- Camel -->
    <camelContext id="camel" xmlns="http://camel.apache.org/schema/blueprint";>
        <routeBuilder ref="testService1"/>
    </camelContext>

</blueprint>

Reply via email to