如何使用Camel从远程WMQ获取消息并在ActiveMQ中发送消息?

时间:2016-05-27 17:53:28

标签: apache-camel activemq ibm-mq

我已经看了好几天了,但仍然没有取得成功。

我在服务器上安装并运行activeMQ。创建了一个名为“testUpdate”的队列。我在另一台服务器上也有另一个队列,让我们调用它“转发”,这是在IBM MQ(WMQ)上。

所以我们在ActiveMQ上有 testUpdate ,在WMQ上有前进。我希望将转发队列中的消息放入 testUpdate 队列中。尝试使用Camel进行此过程。

因此,ActiveMQ中的设置有一个XML(activemq.xml),我可以放置spring bean并配置进行路由。在这个xml中,我将http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd添加到xmlns,然后添加了

import resource =“camel.xml”

在这个新的xml中,我有以下内容:

    <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>

我将jar文件com.ibm.mq.allclient.jar添加到ActiveMQ的lib文件夹中。运行程序时,我收到此异常: java.lang.ClassNotFoundException:javax.jms.JMSRuntimeException

听起来我错过了websphere jar文件?这是对的吗?

3 个答案:

答案 0 :(得分:3)

我定期使用IBM MQ和ActiveMQ。下面的示例将向您展示一些示例配置选项。请确保将这些配置为您自己的用例。

//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>

答案 1 :(得分:1)

您可以使用jms组件来使用来自IBM MQ的消息,并使用activemq组件将其发布到ActiveMQ

查看以下链接

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

谢谢, Gibu

答案 2 :(得分:0)

您可以使用用户骆驼额外组件https://github.com/camel-extra/camel-extra/blob/master/components/camel-wmq/README.md从wmq获取消息,而无需使用JMS包装,然后使用自定义骆驼组件https://camel.apache.org/components/latest/activemq-component.html将消息发送到ActiveMQ。另请参见类似的主题Apache Camel with IBM MQ