pompanoSlayer
pompanoSlayer

Reputation: 163

How to use Camel to get message from remote WMQ and place message in ActiveMQ?

I have been looking at these for days and still haven't have mush success.

I have install and run activeMQ on a server. Created a queue called "testUpdate". I also have another queue on another server, let call this "forward" and this is on the IBM MQ (WMQ).

So we have testUpdate on ActiveMQ and forward on WMQ. I want the message on forward queue to be placed into testUpdate queue. Trying to use Camel for this process.

So the setup in ActiveMQ has an XML(activemq.xml) that I can place spring beans and configure to do the routing. In this xml, I added http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd to the xmlns and then added

import resource="camel.xml"

In this new xml, I have the following:

    <beans
   xmlns="http://www.springframework.org/schema/beans"  
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="
     http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">


        <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
            <route>
                <description>Example Camel Route</description>
                <from uri="mqseries:forward"/>
                <to uri="activemq:testUpdate"/>
            </route>
        </camelContext>

        <bean id="mqseries" class="com.ibm.mq.jms.MQQueueConnectionFactory"> 
                <property name="transportType" value="1"/> 
                <property name="hostName" value="172.00.12.21/> 
                <property name="port" value="xyza"/> 
                <property name="queueManager" value="manager"/> 
                <property name="channel" value="srvcChannel"/> 
        </bean> 

        <!--
           Lets configure some Camel endpoints

           http://camel.apache.org/components.html
        -->

        <!-- configure the camel activemq component to use the current broker -->
        <bean id="activemq" class="org.apache.activemq.camel.component.ActiveMQComponent" >
            <property name="connectionFactory">
              <bean class="org.apache.activemq.ActiveMQConnectionFactory">
                <property name="brokerURL" value="vm://amq-broker?create=false"/>
                <property name="userName" value="${activemq.username}"/>
                <property name="password" value="${activemq.password}"/>
              </bean>
            </property>
        </bean>

    </beans>

I added the jar file com.ibm.mq.allclient.jar into the lib folder of ActiveMQ. When running the program, I am getting this exception: java.lang.ClassNotFoundException: javax.jms.JMSRuntimeException

It sounds like I am missing the websphere jar file? Is this correct?

Upvotes: 1

Views: 3234

Answers (3)

Lukyanov Mikhail
Lukyanov Mikhail

Reputation: 525

You can use users camel extra component https://github.com/camel-extra/camel-extra/blob/master/components/camel-wmq/README.md to get messages from wmq without using the JMS wrapping and then send messages to ActiveMQ with custom camel component https://camel.apache.org/components/latest/activemq-component.html. See also a similar topic Apache Camel with IBM MQ.

Upvotes: 0

Matthew Fontana
Matthew Fontana

Reputation: 3870

I use both IBM MQ and ActiveMQ on a regular basis. This example below will show you some sample configuration options. Please make sure you configure these to your own use cases.

//ActiveMQ connection factory
<bean id="activemq" class="org.apache.activemq.camel.component.ActiveMQComponent" destroy-method="doStop">
    <property name="configuration">
        <bean class="org.apache.camel.component.jms.JmsConfiguration">
            <property name="concurrentConsumers" value="1" />
            <property name="maxConcurrentConsumers" value="1" />
            <property name="acceptMessagesWhileStopping" value="true" />
            <property name="acknowledgementModeName" value="CLIENT_ACKNOWLEDGE" />
            <property name="cacheLevelName" value="CACHE_CONSUMER" />
            <property name="connectionFactory">
                <bean class="org.apache.activemq.pool.PooledConnectionFactory" init-method="start" destroy-method="stop">
                    <property name="maxConnections" value="1" />
                    <property name="MaximumActiveSessionPerConnection" value="500" />
                    <property name="connectionFactory">
                        <bean class="org.apache.activemq.ActiveMQConnectionFactory">
                            <property name="brokerURL" value="${activemq1.brokerUrl}" />
                            <property name="userName" value="${activemq1.username}" />
                            <property name="password" value="${activemq1.password}" />
                            <property name="redeliveryPolicy">
                                <bean class="org.apache.activemq.RedeliveryPolicy">
                                    <property name="maximumRedeliveries" value="-1" />
                                </bean>
                            </property>
                        </bean>
                    </property>
                </bean>
            </property>
        </bean>
    </property>
</bean>

//IBM MQ connection factory
<bean id="ibmmq" class="org.apache.camel.component.jms.JmsComponent" destroy-method="doStop">
    <property name="concurrentConsumers" value="1" />
    <property name="maxConcurrentConsumers" value="1" />
    <property name="connectionFactory">
        <bean class="org.springframework.jms.connection.SingleConnectionFactory" destroy-method="destroy">
            <constructor-arg>
                <bean class="com.ibm.mq.jms.MQQueueConnectionFactory">
                    <property name="transportType" value="1" />
                    <property name="channel" value="${channel}" />
                    <property name="hostName" value="${hostname}" />
                    <property name="port" value="${port}" />
                    <property name="queueManager" value="${queueManager}" />
                </bean>
            </constructor-arg>
        </bean>
    </property>
</bean>

Upvotes: 3

Gibu George
Gibu George

Reputation: 13

You can use jms component to consume the message from IBM MQ and use activemq component to post it to ActiveMQ

have a look at the following links

http://camel.apache.org/jms.html http://camel.apache.org/activemq.html

Thanks, Gibu

Upvotes: 1

Related Questions