I have a CXF configuration (in applicationContext.xml) that talks to
IBM MQ via JNDI resources.
I'd like to use this cxf-configured message queue as a Camel destination.

I'm stuck on the difference between
org.apache.cxf.transport.jms.JMSConfiguration and
org.apache.camel.component.jms.JmsConfiguration,
and whether I can convince Camel to talk to my cxf-configured message queue.

<!-- Here's what I'd like to do with camel: -->
<route>
        <from uri="direct:example"/>
        <to uri="ibmmq://targetDestination" /> <!-- where this queue is
configured with a org.apache.cxf.transport.jms.JMSConfiguration -->
</route>

<!-- ... using camel and pre-existing cxf config ? -->
<bean id="ibmmq" class="org.apache.camel.component.jms.JmsComponent">
        <!-- Obviously this isn't right because jmsConfig is a
org.apache.cxf.transport.jms.JMSConfiguration . . .
         but maybe something similar is possible?  -->
        <property name="configuration" ref="jmsConfig"/>
</bean>

<!-- And here's my pre-existing CXF configuration, which works, and
I'd like to keep as-is  -->

<bean id="myConnectionFactory"
class="org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter">
        <property name="targetConnectionFactory" 
ref="myTargetConnectionFactory"/>
        <property name="username" value="My_UserName"/>
        <property name="password" value="My_Password"/>
</bean>

<bean id="jmsConfig" class="org.apache.cxf.transport.jms.JMSConfiguration">

        <property name="targetDestination" value="jms/My_Target_Queue"/>
         <!-- (won't actually need response queue for camel) -->
        <property name="replyDestination" value="jms/My_Response_Queue"/>

        <property name="connectionFactory" ref="myConnectionFactory" />
        <property name="wrapInSingleConnectionFactory" value="false" />

        <!-- NOTE: Reference to a Spring DestinationResolver. This allows to
define how destination names are resolved to jms Destinations.
        By default a DynamicDestinationResolver is used. It resolves
destinations using the jms providers features.
        If you reference a JndiDestinationResolver you can resolve the
destination names using JNDI.  -->
        <property name="destinationResolver" ref="jmsDestResolver" />

        <!-- NOTE: set to false to avoid:
        "IllegalStateException: Method setExceptionListener not permitted;
nested exception is javax.jms.IllegalStateException:
        Method setExceptionListener not permitted".  -->
        <property name="reconnectOnException" value="false"/>

        <property name="useJms11" value="true" />

        <!-- NOTE: false means use queues, true means use topics  -->
        <property name="pubSubDomain" value="false"/>
        <property name="concurrentConsumers" value="1" />
        <property name="maxConcurrentConsumers" value="10" />

        <!-- NOTE: We cannot use sessionTransacted=true without "Last
Participant Support Extension" support. Setting this to false
        means that JMS Messages are *always* read and acknowledged as
successful regardless of processing in onMessage(). -->
        <property name="sessionTransacted" value="false" />
                
        <!-- NOTE: If we try to use a cache without a transactionManager we
get "Connection closed" errors -->
        <property name="cacheLevelName" value="CACHE_NONE" />

</bean>

<jee:jndi-lookup id="myTargetConnectionFactory"
jndi-name="jms/MY_CONNECTION_FACTORY"/>
<bean id="jmsDestResolver"
class="org.springframework.jms.support.destination.JndiDestinationResolver"/>

Reply via email to