Dear Camel User Support,

We are using Apache ActiveMQ 5.16.7 in our project. It has Camel
2.25.4 embedded.
We are running ActiveMQ/Camel from a Docker container with external volumes.
Our services are written in .Net/C#. They are connecting to ActiveMQ
and sending messages back and forth.
We have very simple Camel routes with a selector on message type
defined in camel.xml which is then referenced from the activemq.xml.
They are working perfectly for the last couple of year now.

A recent requirement made me to investigate content based routing in Camel.
I worked out how I can do it based on header information with
'simple'. That is working OK.
This is working fine in XML DSL without any further settings:

<route>
    <description>Message4</description>
    <from 
uri="activemq:AsyncSendQueue?selector=(JMSType='Shared.Messages.Message4')&amp;disableReplyTo=true"
/>
    <choice>
        <when>
            <simple>${header.NotificationCode} == 'MSGSIM_RoBDischarged' or
                          ${header.NotificationCode} ==
'MSGSIM_OverlanderDischarged' or
                          ${header.NotificationCode} ==
'MSGSIM_ContainerLoadedToWrongPosition'</simple>
            <inOnly uri="activemq:AsyncReceiveQueue?preserveMessageQos=true" />
        </when>
    </choice>
    <log message="Pulled: ${header[JMSCorrelationID]} |
${header[JMSType]} | ${header[JMSTimestamp]}" loggingLevel="INFO"/>
    <inOnly uri="activemq:ANotification.Inbound?preserveMessageQos=true" />
</route>

I also saw that there is a possibility to do content based routing
based on body content with 'jsonpath'.
This is where I'm lost. It is not working.

I could find no documentation or posts about how can I configure
jsonpath to be able to use it from XML DSL without pom file.
I found a lot of blogposts, stack overflow posts, youtube videos that
are only about creating a Java/Spring project where the routes are
defined, and add the dependency to jsonpath into the pom file.
But this is not how our setup looks like.We define our soutes in
camel.xml XML DSL and that's all.

The symptom I'm facing is that when I start up ActiveMQ and when Camel
is reaching the point to load in jsonpath, Camel is shutting down,
then ActiveMQ follows. Then ActiveMQ restarts (well the docker
container makes it to restart).
See the route definition below where 'activemq' is defined separately
as a bean. Without doing any further settings, I've just used
<jsonpath> simply.

<route>
    <description>Message4</description>
    <from 
uri="activemq:AsyncSendQueue?selector=(JMSType='Shared.Messages.Message4')&amp;disableReplyTo=true"
/>
    <choice>
        <when>
            <jsonpath>$.store.book[?(@.price &lt; 10)]</jsonpath>
            <to uri="activemq:AsyncReceiveQueue" />
        </when>
    </choice>
    <log message="Pulled: ${header[JMSCorrelationID]} |
${header[JMSType]} | ${header[JMSTimestamp]}" loggingLevel="INFO"/>
    <inOnly uri="activemq:ANotification.Inbound?preserveMessageQos=true" />
</route>

<bean id="activemq"
class="org.apache.activemq.camel.component.ActiveMQComponent">
    <property name="connectionFactory">
        <bean class="org.apache.activemq.ActiveMQConnectionFactory">
            <property name="brokerURL" value="vm://localhost?create=false" />
            <property name="userName" value="${activemq.username}" />
            <property name="password" value="${activemq.password}" />
        </bean>
    </property>
</bean>

I managed to turn on DEBUG level logging for Camel, and it is shutting
down when it is searching for languages 'jsonpath' and
'jsonpath-language'. No ERROR message found for jsonpath.
It is a bit strange because the same log lines are there for 'simple',
and that is working OK.
Log fragments:

2024-12-18 11:48:34,256 | DEBUG | Lookup Language with name simple in
registry. Found: null | org.apache.camel.util.ResolverHelper | main
2024-12-18 11:48:34,267 | DEBUG | Lookup Language with name
simple-language in registry. Found: null |
org.apache.camel.util.ResolverHelper | main
2024-12-18 11:48:34,269 | DEBUG | Simple language predicate/expression
cache size: 1000 | org.apache.camel.language.simple.SimpleLanguage |
main
...
2024-12-18 11:48:34,379 | DEBUG | Lookup Language with name jsonpath
in registry. Found: null | org.apache.camel.util.ResolverHelper | main
2024-12-18 11:48:34,380 | DEBUG | Lookup Language with name
jsonpath-language in registry. Found: null |
org.apache.camel.util.ResolverHelper | main
2024-12-18 11:48:34,383 | INFO  | Apache Camel 2.25.4 (CamelContext:
camel) is shutting down | org.apache.camel.spring.SpringCamelContext |
main
2024-12-18 11:48:34,384 | DEBUG | Shutting down with no inflight
threads. | org.apache.camel.impl.DefaultAsyncProcessorAwaitManager |
main

I then downloaded and copied camel-jsonpath 2.25.4 jar file inside the
docker container under opt/activemq/lib/camel folder because this is
the folder where I have the camel jar files.
It was not working. The same symptom of Camel and ActiveMQ shutting
down and docker container restarting them continuously.
I also downloaded camel-core-languages-3.10.0.jar file and copied to
the same location. I ended up with version 3.10.0 because I found no
2.25.4 version for camel-core-languages and based on date 3.10.0 was
around the time when camel 2.25.4 was released.
It did not help. The same symptom of Camel and ActiveMQ shutting down
and docker container restarting them continuously.

- activemq-camel-5.16.7.jar
- camel-core-2.25.4.jar
- camel-core-languages-3.10.0.jar
- camel-jms-2.25.4.jar
- camel-jsonpath-2.25.4.jar
- camel-spring-2.25.4.jar

I thought then I need to reference it somewhere, example I was
thinking that I have to set it up as a bean.
I cloned down camel 2.25.4 from git and navigated through the code.
I see that languages 'simple' and 'xpath' are under camel-core
org.apache.camel.language namespace.
'jsonpath' however is under camel components camel-jsonpath
org.apache.camel.jsonpath.
I tried to add the following bean to camel.xml but honestly I did not
know what properties to set up for it because I found no documentation
about it:

<bean id="jsonpath" class="org.apache.camel.jsonpath.JsonPathLanguage">
</bean>

Having this bean in camel.xml caused a different error about not able
to find the class JsonPathLanguage and load it in.

2024-12-18 12:07:09,650 | ERROR | Failed to load: class path resource
[activemq.xml], reason: Failed to load type:
org.apache.camel.jsonpath.JsonPathLanguage. Reason:
java.lang.ClassNotFoundException:
org.apache.camel.jsonpath.JsonPathLanguage; nested exception is
java.lang.ClassNotFoundException:
org.apache.camel.jsonpath.JsonPathLanguage |
org.apache.activemq.xbean.XBeanBrokerFactory | main
org.springframework.beans.factory.BeanDefinitionStoreException: Failed
to load type: org.apache.camel.jsonpath.JsonPathLanguage. Reason:
java.lang.ClassNotFoundException:
org.apache.camel.jsonpath.JsonPathLanguage; nested exception is
java.lang.ClassNotFoundException:
org.apache.camel.jsonpath.JsonPathLanguage
at 
org.apache.xbean.spring.context.v2c.XBeanQNameHelper.getBeanInfo(XBeanQNameHelper.java:75)
at 
org.apache.xbean.spring.context.v2c.XBeanQNameHelper.coerceNamespaceAwarePropertyValues(XBeanQNameHelper.java:54)
at 
org.apache.xbean.spring.context.v2c.XBeanBeanDefinitionParserDelegate.parseBeanDefinitionElement(XBeanBeanDefinitionParserDelegate.java:59)
at 
org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseBeanDefinitionElement(BeanDefinitionParserDelegate.java:459)
at 
org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseBeanDefinitionElement(BeanDefinitionParserDelegate.java:428)
at 
org.apache.xbean.spring.context.v2.XBeanBeanDefinitionDocumentReader.processBeanDefinition(XBeanBeanDefinitionDocumentReader.java:188)
at 
org.apache.xbean.spring.context.v2.XBeanBeanDefinitionDocumentReader.parseDefaultElement(XBeanBeanDefinitionDocumentReader.java:115)
at 
org.apache.xbean.spring.context.v2.XBeanBeanDefinitionDocumentReader.parseBeanDefinitions(XBeanBeanDefinitionDocumentReader.java:95)
at 
org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:142)
at 
org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:94)
at 
org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:508)
at 
org.apache.xbean.spring.context.v2.XBeanXmlBeanDefinitionReader.registerBeanDefinitions(XBeanXmlBeanDefinitionReader.java:79)
at 
org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:392)
at 
org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:336)
at 
org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:304)
at 
org.apache.xbean.spring.context.v2.XBeanBeanDefinitionDocumentReader.importBeanDefinitionResource(XBeanBeanDefinitionDocumentReader.java:143)
at 
org.apache.xbean.spring.context.v2.XBeanBeanDefinitionDocumentReader.parseDefaultElement(XBeanBeanDefinitionDocumentReader.java:109)
at 
org.apache.xbean.spring.context.v2.XBeanBeanDefinitionDocumentReader.parseBeanDefinitions(XBeanBeanDefinitionDocumentReader.java:95)
at 
org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:142)
at 
org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:94)
at 
org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:508)
at 
org.apache.xbean.spring.context.v2.XBeanXmlBeanDefinitionReader.registerBeanDefinitions(XBeanXmlBeanDefinitionReader.java:79)
at 
org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:392)
at 
org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:336)
at 
org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:304)
at 
org.apache.xbean.spring.context.ResourceXmlApplicationContext.loadBeanDefinitions(ResourceXmlApplicationContext.java:116)
at 
org.apache.xbean.spring.context.ResourceXmlApplicationContext.loadBeanDefinitions(ResourceXmlApplicationContext.java:104)
at 
org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:126)
at 
org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:614)
at 
org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:514)
at 
org.apache.xbean.spring.context.ResourceXmlApplicationContext.<init>(ResourceXmlApplicationContext.java:64)
at 
org.apache.xbean.spring.context.ResourceXmlApplicationContext.<init>(ResourceXmlApplicationContext.java:52)
at 
org.apache.activemq.xbean.XBeanBrokerFactory$1.<init>(XBeanBrokerFactory.java:104)
at 
org.apache.activemq.xbean.XBeanBrokerFactory.createApplicationContext(XBeanBrokerFactory.java:104)
at 
org.apache.activemq.xbean.XBeanBrokerFactory.createBroker(XBeanBrokerFactory.java:67)
at org.apache.activemq.broker.BrokerFactory.createBroker(BrokerFactory.java:71)
at org.apache.activemq.broker.BrokerFactory.createBroker(BrokerFactory.java:54)
at 
org.apache.activemq.console.command.StartCommand.runTask(StartCommand.java:87)
at 
org.apache.activemq.console.command.AbstractCommand.execute(AbstractCommand.java:63)
at 
org.apache.activemq.console.command.ShellCommand.runTask(ShellCommand.java:154)
at 
org.apache.activemq.console.command.AbstractCommand.execute(AbstractCommand.java:63)
at org.apache.activemq.console.command.ShellCommand.main(ShellCommand.java:104)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native
Method)
at 
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at 
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.apache.activemq.console.Main.runTaskClass(Main.java:262)
at org.apache.activemq.console.Main.main(Main.java:115)
Caused by: java.lang.ClassNotFoundException:
org.apache.camel.jsonpath.JsonPathLanguage
at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:476)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:594)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:527)
at 
org.apache.xbean.spring.context.v2c.XBeanQNameHelper.loadClass(XBeanQNameHelper.java:107)
at 
org.apache.xbean.spring.context.v2c.XBeanQNameHelper.getBeanInfo(XBeanQNameHelper.java:72)

So my questions are:
Is there a way to make this work with XML DSL only (no Java/Spring
project with pom file)?
Or is this working only if we define our routes in a Java/Spring
project where we can add the dependency to jsonpath into the pom file?

Your help would be very much appreciated!
Best Regards,
Zsuzsa.

Reply via email to