使用 ackMode MULE_AUTO 在 Mule ESB AMQP 连接器中拒绝和重新排队消息
Reject and requeue message in Mule ESB AMQP Connector with ackMode MULE_AUTO
我的用例是通过 SMTP 出站端点发送邮件。
- 当一切正常时,消息被确认,
- 当验证错误(例如格式错误的电子邮件)时,我想拒绝该消息,
- 当 SMTP 服务器出现 ConnectionException 时,我想等待 1 分钟,拒绝邮件并重新排队再试一次。
我将 Mule AMQP 连接器与 ackMode="MULE_AUTO"
一起使用。
- 正确处理流程后,Mule 会自动确认消息。
- 当捕获异常策略发生错误时,消息被拒绝并发送到死信交换(不重新排队)。
我试过使用回滚异常策略,但这似乎不起作用。
有谁知道是否可以拒绝邮件并重新排队?
(Mule ESB CE 3.7.0 - Mule AMQP 传输 3.6.2.20150520)
是的,这是可能的。
您需要使用ackMode=Manual
1) 对于成功场景:您需要在流程结束时使用 <amqp:acknowledge-message />
手动确认消息,或者您认为逻辑消息可以被确认的地方。
2) 对于失败场景:验证错误等,当异常抛出时,它将被捕捉异常策略 - 使用 <amqp:reject-message />
。它有助于拒绝消息。
3)对于连接异常:在捕获异常策略中使用<amqp:reject-message requeue="true" />
,这将再次将原始消息推回同一个队列。参考:https://github.com/mulesoft/mule-transport-amqp/blob/master/GUIDE.md#manual-message-acknowledgement-and-rejection
第二种和第三种情况都需要在异常策略中处理。所以使用 ChoiceException strategy
where in use 2 catch exception strategy
为 'validation error' 定义一个,另一个为 'connection Exception'。参考:https://docs.mulesoft.com/mule-user-guide/v/3.7/choice-exception-strategy
注意:使用Manual ack
时,无论success/failure场景如何,都需要手动对外确认或拒绝消息。遗漏任何消息都将保留在队列中。
我的用例是通过 SMTP 出站端点发送邮件。
- 当一切正常时,消息被确认,
- 当验证错误(例如格式错误的电子邮件)时,我想拒绝该消息,
- 当 SMTP 服务器出现 ConnectionException 时,我想等待 1 分钟,拒绝邮件并重新排队再试一次。
我将 Mule AMQP 连接器与 ackMode="MULE_AUTO"
一起使用。
- 正确处理流程后,Mule 会自动确认消息。
- 当捕获异常策略发生错误时,消息被拒绝并发送到死信交换(不重新排队)。
我试过使用回滚异常策略,但这似乎不起作用。
有谁知道是否可以拒绝邮件并重新排队?
(Mule ESB CE 3.7.0 - Mule AMQP 传输 3.6.2.20150520)
是的,这是可能的。
您需要使用ackMode=Manual
1) 对于成功场景:您需要在流程结束时使用 <amqp:acknowledge-message />
手动确认消息,或者您认为逻辑消息可以被确认的地方。
2) 对于失败场景:验证错误等,当异常抛出时,它将被捕捉异常策略 - 使用 <amqp:reject-message />
。它有助于拒绝消息。
3)对于连接异常:在捕获异常策略中使用<amqp:reject-message requeue="true" />
,这将再次将原始消息推回同一个队列。参考:https://github.com/mulesoft/mule-transport-amqp/blob/master/GUIDE.md#manual-message-acknowledgement-and-rejection
第二种和第三种情况都需要在异常策略中处理。所以使用 ChoiceException strategy
where in use 2 catch exception strategy
为 'validation error' 定义一个,另一个为 'connection Exception'。参考:https://docs.mulesoft.com/mule-user-guide/v/3.7/choice-exception-strategy
注意:使用Manual ack
时,无论success/failure场景如何,都需要手动对外确认或拒绝消息。遗漏任何消息都将保留在队列中。