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>

Reply via email to