有没有一种方法可以为特定异常指定重试消息的等待时间?
例如,如果对象处于SomethingInProgress状态,则抛出SomethignInProgressException,我希望消息在40m后重试。还是引发SomethingInProgressEvent并使用bus.defer更合适?
这是Rebus不具有二级重试概念的部分原因-我根本没有看到可以以通用且足够灵活的方式创建此功能的任何方式。
简短地回答您的问题:不,没有(内置)改变特定异常重试之间的时间的方法。事实上,有没有办法来配置重试之间的等待时间在所有-失败的消息将被重试为快,可能的话,然后移动到错误队列,如果他们一直没能避免“堵塞管道”。
对于您的情况,我建议您执行以下操作:
public void Handle(MyMessage message) {
var headers = MessageContext.GetCurrent().Headers;
var deliveryAttempt = headers.ContainsKey("attempt_no")
? Convert.ToInt(headers["attempt_no"])
: 0;
try {
DoWhateverWithThe(message);
} catch(OneKindOfException e) {
if (deliveryAttempt > 5) {
bus.Advanced.Routing.ForwardCurrentMessage("error");
return;
}
bus.AttachHeader(message, "attempt_no", deliveryAttempt + 1);
bus.Defer(TimeSpan.FromSeconds(20), message);
} catch(AnotherKindOfException e) {
if (deliveryAttempt > 5) {
bus.Advanced.Routing.ForwardCurrentMessage("error");
return;
}
bus.AttachHeader(message, "attempt_no", deliveryAttempt + 1);
bus.Defer(TimeSpan.FromMinutes(2), message);
}
}
我只是在脑海中写下了自己的想法,但并没有100%地确定它确实可以编译...但是要点是,我们跟踪在消息的自定义标头中进行了多少次传递尝试,然后bus.Defer
响起消息每次失败的传递尝试的适当时间跨度,如果超过我们的最大传递尝试次数,则立即将消息转发到错误队列。
我希望这是有道理的 :)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句