【问题标题】:Message to Websphere MQ doesn't receive reply (Fuse ESB 7.1)到 Websphere MQ 的消息未收到回复 (Fuse ESB 7.1)
【发布时间】:2013-12-18 04:51:07
【问题描述】:

我正在向供应商定义为“S”(同步)的 Websphere-MQ 队列发送“RequestSnapshot” - 所以我希望通过 Apache Camel inOut 集成模式收到回复,运行在保险丝 ESB 中。

from("direct:" + SEND_SUBSCRIPTION)
        .routeId(getFinalRouteName(SEND_SUBSCRIPTION))
        .log("Sending Request Snapshot request to webspheremq")
        .bean(CreateSnapshotRequest.class)
        .marshal(myDataFormat)
        .convertBodyTo(String.class)
        .inOut("webspheremq:queue:SNAPSHOT_REQUESTS.HT")   // **1** works, but no Reply!!
        .log("RequestSnapshot response: ${body}")          // doesnt reach this line

我知道快照请求消息被正确传输,因为在我发送它之后,我收到了关于不同 MQ 主题的数据。

问题是我没有收到响应,执行在标记为**1** 的行上停止 - 20 秒后我超时。

org.apache.camel.ExchangeTimedOutException: The OUT message was not received
within: 20000 millis due reply message with correlationID:
Camel-ID-XYZ012-54037-1385986757895-0-3 not received.

通常,通过 java 代码,这会有所不同,但这里我们使用Fuse ESB 并且inOut 机制应该发送消息并获得关于所谓的DYNAMIC REPLY-TO QUEUE 的回复。

我对“回复”队列的理解有些有限,我只知道 Fuse ESB 应该监听某种临时 mq 的响应,但这应该通过 inOut 透明地工作。

这是我来自blueprint.xml的配置bean:

<bean id="webspheremq" class="org.apache.camel.component.jms.JmsComponent">
    <property name="connectionFactory">
        <bean class="com.ibm.mq.jms.MQConnectionFactory">
            <property name="transportType" value="1"/>
            <property name="hostName" value="1.2.3.4"/>
            <property name="port" value="1417"/>
            <property name="channel" value="SOME.CHANNEL"/>
            <property name="temporaryModel" value="SOME_MODEL_QUEUE"/>
            <property name="CCSID" value="789"/>
            <property name="queueManager" value="SOMEGATE"/>
            <property name="brokerSubQueue" value="SYSTEM.JMS.ND.MACHINE.USER.*"/>
            <property name="brokerControlQueue" value="SOME_SUBSCRIPTION.HT"/>
            <property name="brokerQueueManager" value="SOMEHUB"/>
            <property name="tempQPrefix" value="MACHINE.USER.*"/>
        </bean>
    </property>
</bean>

我想到的另一个问题是防火墙端口,我们要求打开 1417 和 1499,但似乎只有 1417 是开放的。另外我不知道防火墙端口是否在相反的方向打开,从 WebsphereMQ 回到我。

如果有人可以提供任何建议,我将非常感激!

编辑 1:

我尝试了克劳斯的replyTo=queue:XYZ建议,结果是这样的:

2013-12-03 14:38:04,636 | WARN  | eplyManager[FOO] | entQueueMessageListenerContainer
| ?                                   ? | 153 - org.springframework.jms - 
3.0.7.RELEASE |     Setup of JMS message listener invoker failed for destination 'FOO'
- trying to recover. Cause: MQJMS2008: failed to open MQ queue ; nested exception is 
com.ibm.mq.MQException: MQJE001: Completion Code 2, Reason 2085

【问题讨论】:

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


    【解决方案1】:

    您也可以使用命名回复队列。也许这对 WMQ 更有效。因此,在 Camel 端点 uri 中,您只需设置 replyTo=queue:foobar 以使用名为 foobar 的队列作为回复队列。

    这会将 JMSReplyTo 标头设置为 foobar 作为队列名称,因此“另一端”将使用它作为回复队列,而不是临时队列名称。

    有关通过 JMS 请求/回复的更多详细信息,请参阅 Camel JMS 文档,因为您可以配置和调整许多选项:http://camel.apache.org/jms

    同样在过去WMQ没有链接长相关ID,并且选项useMessageIDAsCorrelationID可以设置为true,以使用WMQ为请求消息生成的消息ID。否则 Camel 会生成一个长的随机 id。

    【讨论】:

    • 谢谢克劳斯,我明天回办公室试试。
    • 我以各种方式尝试了replyTo=queue:FOO(例如使用类似于我的 tempQName 的前缀),但它无法设置队列(参见编辑),我遇到了 MQException。然后使用useMessageIDAsCorrelationID 结果是一样的——20000 毫秒后超时。还有其他建议吗?
    • 这个问题的最终解决方案是使用deliveryPersistent=1useMessageIDAsCorrelationID=true 配置队列uri。
    • 关于相关 ID,WMQ 有一种奇怪的方法,可以返回一个以ID: 开头的字符串,其中包含您发送的相关 ID 的前 24 个字符的 Ascii 字符代码。如果您首先自己进行此转换(正如我假设 useMessageIDAsCorrelationID 为您所做的那样),那么您将获得相同的 Correlation id(如预期的那样)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-31
    • 1970-01-01
    • 2016-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    相关资源
    最近更新 更多