2

我真的对这个概念感到震惊。我有一个名为“IN”的 WMQ 输入队列(在 WMQ 中为这个名为“BACKOUT”的队列配置了回退队列,阈值为 4)。正如预期的那样,它进行了 3 次重试,最后 BACKOUT 队列计数正在增加,但是当我尝试浏览消息时,我无法看到这些消息。一旦我停止 mule 流并重新启动 WMQ 资源管理器,我就可以在“BACKOUT”中看到消息。请找到我的配置 xml。请帮助我。提前致谢。

谷歌搜索,发现这是事务未提交的问题。但即使经过多次试验也无法解决问题。请帮忙。

    <?xml version="1.0" encoding="UTF-8"?>
    <wmq:connector name="WMQ_Connector" hostName="hostName" port="1portName" queueManager="QM" channel="Channel" validateConnections="true" doc:name="WMQ Connector" disableTemporaryReplyToDestinations="true"/>
   <flow name="BackoutFlow1" doc:name="BackoutFlow1">
    <wmq:inbound-endpoint  queue="IN" connector-ref="WMQ_Connector" doc:name="WMQ" exchange-pattern="request-response" >

        <wmq:transaction action="ALWAYS_BEGIN"/>

    </wmq:inbound-endpoint>
        <logger message="*******#[payload]****" level="INFO" doc:name="Logger"/>
        <set-payload value="#[hi]" doc:name="Set Payload"/>

    <wmq:outbound-endpoint queue="OUT" connector-ref="WMQ_Connector" doc:name="WMQ">
        <wmq:transaction action="NONE"/>
    </wmq:outbound-endpoint>
</flow>

4

1 回答 1

1

WebSphere MQ 将该消息写入同步点下的回退队列。但它不知道应用程序的上下文,否则它不知道是否COMMIT代表您。作为一般规则,WMQ 尽量不隐含地做不可逆转的事情,而是要求程序的一部分显式操作。

理论上,程序知道何时发出 aBACKOUT并可以在需要时立即发出 a COMMIT,否则继续处理消息并将退出的消息包含在下一个工作单元中。例如,该程序可以查看消息的回退计数以确定给定消息是新消息还是正在重新传递。

在回退队列中,当消息处于同步点下时,您无法看到该消息。显然,当您停止 Mule 时,COMMIT正在发出 a 。如果导致退出的应用程序被杀死而不是按顺序停止,通常的结果是消息由于隐式ROLLBACK命令而重新排队到输入队列中。

要在不停止 Mule 的情况下查看消息,请COMMIT在程序中发出 a 或将第二条消息放入队列中,该消息将被读取并提交且不会回滚。该COMMIT第二条消息也COMMIT将在回退队列中回退消息。

于 2014-04-07T16:52:01.360 回答