javajbossapache-cameljmsjboss6.x

Connect to a queue on JBoss EAP6 from Camel


I have a HornetQ JMS queue set on JBoss EAP6, in the standalone.xml file.

<hornetq-server>
[...]
    <jms-connection-factories>
        <connection-factory name="RemoteConnectionFactory">
            <connectors>
                <connector-ref connector-name="netty"/>
            </connectors>
            <entries>
                <entry name="java:jboss/exported/jms/RemoteConnectionFactory"/>
            </entries>
        </connection-factory>
    </jms-connection-factories>

    <jms-destinations>
        <jms-queue name="WorkflowExecution">
            <entry name="/queue/MyQueue"/>
            <entry name="java:jboss/exported/queue/MyQueue"/>
        </jms-queue>
    </jms-destinations>
</hornetq-server>

The queue works fine, and I can send messages on it using tools like Hermes JMS.

I'm working on a standalone client application, running in Fuse 4.4, that has to send a message to the queue via a Camel route but I can't figure out how to set the connector in the configuration.

This is what I tried to set in the camel-context.xml file:

<bean id="jmsinjection" class="org.apache.camel.component.jms.JmsComponent">
  <property name="connectionFactory">
    <bean class="org.springframework.jndi.JndiObjectFactoryBean">
      <property name="jndiName" value="jms/RemoteConnectionFactory" />
      <property name="jndiEnvironment">
        <props>
          <prop key="java.naming.provider.url">remote://myEAPurl:port</prop>
          <prop key="java.naming.factory.initial">org.jboss.naming.remote.client.InitialContextFactory</prop>
        </props>
      </property>
    </bean>
  </property>
</bean>

And the exception I get:

Error creating bean with name 'jmsinjection' defined in URL [bundle://79.37:0/META-INF/spring/camel-context.xml]: Initialization of bean failed; nested exception is org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type 'org.hornetq.jms.client.HornetQJMSConnectionFactory' to required type 'javax.jms.ConnectionFactory' for property 'connectionFactory'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [org.hornetq.jms.client.HornetQJMSConnectionFactory] to required type [javax.jms.ConnectionFactory] for property 'connectionFactory': no matching editors or conversion strategy found

According to the javadoc, HornetQJMSConnectionFactory implements javax.jms.QueueConnectionFactory which extends javax.jms.ConnectionFactory, so I don't get why I get this exception.

I spent hours scraping JBoss forum and doc but can't find a way to make it work.

What is wrong in my camel configuration? How to fix it?


Solution

  • The problem is due to the OSGi class-loader.

    Fuse ESB already has a version of javax.jms.ConnectionFactory loaded in the classpath.

    Adding the jboss-client.jar does add the HornetQJMSConnectionFactory to the classpath but also another version of the ConnectionFactory.

    The solution is to add all the following dependencies to the bundle and remove the jboss-client.jar as indicated on this page:

    hornetq-core
    hornetq-jms
    jboss-ejb-client
    jboss-logging
    jboss-logmanager
    jboss-marshalling
    jboss-marshalling-river
    jboss-remote-naming
    jboss-remoting
    jboss-sasl
    netty
    remoting-jmx
    xnio-api
    xnio-nio
    

    You can find all those dependencies with the correct version directly on your JBoss EAP instance repository. Names may be a bit different.