Camel:给WMQ写消息

时间:2014-06-05 10:16:58

标签: java spring jms apache-camel ibm-mq

目前我正在与camel和wmq合作。我试图做的是向wmq发送消息。我使用Spring Framework配置了camel。以下是如何配置wmq:

  

component.xml文件

<bean id="websphere-mq" class="org.apache.camel.component.jms.JmsComponent">
        <property name="connectionFactory">
            <bean class="com.ibm.mq.jms.MQQueueConnectionFactory">
                <property name="transportType">
                    <util:constant static-field="com.ibm.mq.jms.JMSC.MQJMS_TP_CLIENT_MQ_TCPIP" />
                </property>
                <property name="hostName" value="localhost" />
                <property name="port" value="1414" />
                <property name="queueManager" value="localmanager" />
                <property name="channel" value="CH.ADM1" />
                <property name="CCSID" value="819"/>
                <property name="useConnectionPooling" value="true" />
            </bean>
        </property>
</bean>
  

config.xml中

<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">

    <route>
        <from uri="stream:in?promptMessage=Ausweisnummer: "/>
        <process ref="TransformToXML"/>
        <to uri ="xslt:mobako.sender.xsl"/>
        <to uri ="websphere-mq:queue:LSMH.ZKSEAP.SERVICEBUS"/>
    </route>

    <route>
        <from uri="websphere-mq:queue:ZKSEAP.LSMH.SERVICEBUS"/>
        <to uri="stream:out"/>
    </route>

</camelContext>

当我检查wmq时,我发现wmq一直在听我的进程,但它没有收到任何消息。

然后检查我的wmq配置是否正确,我尝试将config.xml更改为:

<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">

    <route>
        <from uri="websphere-mq:queue:ZKSEAP.LSMH.SERVICEBUS"/>
        <to uri="stream:out"/>
    </route>

</camelContext>

之后我尝试手动将消​​息写入wmq。当我尝试运行我的进程时,来自wmq的消息在我的控制台上写入。

然后,我总结一下,通过我的配置,我可以从wmq获取消息,但我无法写入wmq。

实际上是什么问题?我的配置有什么问题或遗漏吗?非常感谢。

EDITED

嘿,终于我发现了什么是错的。 问题是:我的jms版本与我的骆驼版本不一样。 但是,在我更改了jms版本之后,我在服务器上遇到了以下错误(关于wmq):

  

2014-06-05 15:14:34,859 [Axis2 Task] ERROR WMQMsg - 预期的MQ消息格式'   MQSTR',但收到'MQHRF2'

如何解决?再次感谢。

2 个答案:

答案 0 :(得分:0)

我认为您的问题出在您的JMS消息类型和转换中。 请参阅以下链接,然后尝试转换您从stream:in获得的邮件类型。

http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_7.0.1/com.ibm.mq.csqzaw.doc/jm25524_.htm?cp=SSFKSJ_7.0.1%2F1-25-3-4-1-1-1&lang=en

http://www.capitalware.com/rl_blog/?p=1168

Processing MQ ByteMessage using JMS client

答案 1 :(得分:0)

首先,我不太了解你的路线:

                                    具体来说,你有两个.to uris。也许我错了,但从逻辑上讲,你需要某种逻辑来将消息路由到一个或另一个端点。

其次,如果可以,我将为您提供适合我的解决方案。 据我所知,你只需要设置jms类型的camel端点,然后让camel为你做所有的样板代码。你确实需要一个特定的ConnectionFactory(在我们的例子中是wmq)。我将用Java创建它,使用Spring bean进行操作只会增加复杂性。

CamelContext camelContext = new DefaultCamelContext();
    MQQueueConnectionFactory connectionFactory = new MQQueueConnectionFactory();
    connectionFactory.setHostName("localhost");
try {
        connectionFactory.setPort(1414);
        connectionFactory.setQueueManager("QueueManagerName");
        connectionFactory.setChannel("ChannelName");
        connectionFactory.setTransportType(1);
    } catch (JMSException e) {
        e.printStackTrace();
    }
    camelContext.addComponent("wmq", JmsComponent.jmsComponentAutoAcknowledge(connectionFactory));

对于第二部分,我们可以将wmq用作任何其他端点。

try {
        camelContext.addRoutes(new RouteBuilder() {

            @Override
            public void configure() throws Exception {
                from("file://data/in/?noop=true")
                        .to("wmq:queue:YourQueueName");
            }
        });
    } catch (Exception e) {
        e.printStackTrace();
    }