Mule4 IBM MQ 连接器:处于 ACK 模式 "AUTO" - 循环中的消息 运行 - 无限
Mule4 IBM MQ connector: In ACK mode "AUTO" - Message running in loop - infinity
我有 IBM MQ 连接器的基本流程和所有默认设置(Ack 模式 AUTO
)。如果流程在两者之间抛出错误,则消息在循环中开始 运行 而不会结束线程。
我希望因为它是 AUTO
它应该通过看到错误来结束线程。
据我所知在旧版本 3.6 中它在 ACK mode AUTO
中运行良好
在 Mule4 中 - 在设置 ACK Manual
或 Immediate
时它工作正常。
我尝试将 IBM MQ Connector 更新到 v1.6.0
,并将所有客户端 jar 更新到最新的“9.1.2.0”。所有行为都相同。
谁能解释一下这是 Mule4 中 IBM 队列连接器的默认行为 ACK mode AUTO
。
谁能指出我遗漏了什么?
我使用的是 Mule 版本:4.2.2
<ibm-mq:config name="IBM_MQ_Config" doc:name="IBM MQ Config" doc:id="a217b071-0d6b-4674-8696-0a74c8e8b4ee" sendCorrelationId="ALWAYS">
<ibm-mq:connection username="admin" password="passw0rd">
<ibm-mq:connection-mode >
<ibm-mq:client host="${mq.inbound.host}" queueManager="${mq.inbound.queueManager}" channel="${mq.inbound.channelName}" port="${mq.inbound.port}"/>
</ibm-mq:connection-mode>
</ibm-mq:connection>
<flow name="NotificationFlow" doc:id="a275ef91-8608-49a5-adcc-624c2dc6aacd" >
<ibm-mq:listener doc:name="On New Message" doc:id="5de4cf1b-bd66-4519-b170-69f2159bd8b4" config-ref="IBM_MQ_Config" destination="testQ" ackMode="AUTO"/>
<logger level="INFO" doc:name="Logger" doc:id="9c4c241b-d564-44ff-a2a3-6433e48ddf0a" />
<ee:transform doc:name="Transform Message" doc:id="46c10c0c-3f0a-4184-a722-7caab39ca97d" >
<ee:message >
<ee:set-payload ><![CDATA[%dw 2.0
import * from dw::Runtime
var result = []
output application/java
---
if(sizeOf(result) <= 0) fail('Data was empty') else result]]></ee:set-payload>
</ee:message>
</ee:transform>
</flow>
这似乎是预期的结果。当流程出现错误时,消息没有被确认,所以它被返回到队列中。下一次读取将收到相同的未确认消息。那叫一个poison message.
从应用程序端,您可以处理错误,这样它就不会冒泡到流程中,并使用继续错误处理程序。以这种方式处理错误,并在流程完成时确认消息。
如果您想管理重新交付,您必须配置代理(在本例中为 IBM MQ)以不同的方式处理重新交付,例如将其发送到DLQ。有关更多详细信息,请参阅 this other question 中的评论。
我有 IBM MQ 连接器的基本流程和所有默认设置(Ack 模式 AUTO
)。如果流程在两者之间抛出错误,则消息在循环中开始 运行 而不会结束线程。
我希望因为它是 AUTO
它应该通过看到错误来结束线程。
据我所知在旧版本 3.6 中它在 ACK mode AUTO
在 Mule4 中 - 在设置 ACK Manual
或 Immediate
时它工作正常。
我尝试将 IBM MQ Connector 更新到 v1.6.0
,并将所有客户端 jar 更新到最新的“9.1.2.0”。所有行为都相同。
谁能解释一下这是 Mule4 中 IBM 队列连接器的默认行为 ACK mode AUTO
。
谁能指出我遗漏了什么?
我使用的是 Mule 版本:4.2.2
<ibm-mq:config name="IBM_MQ_Config" doc:name="IBM MQ Config" doc:id="a217b071-0d6b-4674-8696-0a74c8e8b4ee" sendCorrelationId="ALWAYS">
<ibm-mq:connection username="admin" password="passw0rd">
<ibm-mq:connection-mode >
<ibm-mq:client host="${mq.inbound.host}" queueManager="${mq.inbound.queueManager}" channel="${mq.inbound.channelName}" port="${mq.inbound.port}"/>
</ibm-mq:connection-mode>
</ibm-mq:connection>
<flow name="NotificationFlow" doc:id="a275ef91-8608-49a5-adcc-624c2dc6aacd" >
<ibm-mq:listener doc:name="On New Message" doc:id="5de4cf1b-bd66-4519-b170-69f2159bd8b4" config-ref="IBM_MQ_Config" destination="testQ" ackMode="AUTO"/>
<logger level="INFO" doc:name="Logger" doc:id="9c4c241b-d564-44ff-a2a3-6433e48ddf0a" />
<ee:transform doc:name="Transform Message" doc:id="46c10c0c-3f0a-4184-a722-7caab39ca97d" >
<ee:message >
<ee:set-payload ><![CDATA[%dw 2.0
import * from dw::Runtime
var result = []
output application/java
---
if(sizeOf(result) <= 0) fail('Data was empty') else result]]></ee:set-payload>
</ee:message>
</ee:transform>
</flow>
这似乎是预期的结果。当流程出现错误时,消息没有被确认,所以它被返回到队列中。下一次读取将收到相同的未确认消息。那叫一个poison message.
从应用程序端,您可以处理错误,这样它就不会冒泡到流程中,并使用继续错误处理程序。以这种方式处理错误,并在流程完成时确认消息。
如果您想管理重新交付,您必须配置代理(在本例中为 IBM MQ)以不同的方式处理重新交付,例如将其发送到DLQ。有关更多详细信息,请参阅 this other question 中的评论。