gpt4 book ai didi

rebus - 有没有办法指定重试消息的等待时间?

转载 作者:行者123 更新时间:2023-12-01 10:46:51 25 4
gpt4 key购买 nike

有没有办法指定为特定异常重试消息的等待时间?

例如。如果对象处于 SomethingInProgress 状态,则抛出 SomethignInProgressException 并且我希望消息在 40m 后重试。或者,提出一个SomethingInProgressEvent 并使用bus.defer 是否更合适?

最佳答案

这也是Rebus没有second-level retries这个概念的部分原因。 - 我根本没有看到可以以通用且仍然足够灵活的方式创建此函数的任何方式。

简短回答您的问题:不,没有(内置)方法可以改变特定异常的重试之间的时间。事实上,根本无法配置重试之间的等待时间——失败的消息将被尽可能快地重试,如果它们一直未能避免“堵塞管道”,则将它们移至错误队列。

在你的情况下,我建议你做这样的事情:

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对于每次失败的传递尝试,在适当的时间跨度内响铃消息,当超过我们的最大传递尝试次数时,立即将消息转发到错误队列。

我希望这是有道理的 :)

关于rebus - 有没有办法指定重试消息的等待时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25274744/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com