Hi, It looks like a change in the Camel routing engine (DefaultAsyncProcessorAwaitManager). Let me take a look.
Regards JB On Wed, Jun 1, 2022 at 8:21 PM Wing, Lucas A (US) <lucas.w...@baesystems.com.invalid> wrote: > > 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>