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

Rebus 有没有办法指定重试消息的等待时间?,rebus,Rebus,是否有方法指定针对特定异常重试消息的等待时间 例如,如果对象处于SomethingInProgress状态,则抛出SomethingInProgressException,我希望消息在40m后重试。还是更适合提出一个somethingingpressevent并使用bus.defer?这就是为什么Rebus没有-的概念的部分原因,我只是没有看到任何方法可以以一种通用且足够灵活的方式创建此函数 简短地回答您的问题:不,没有(内置)方法可以改变特定异常的重试时间。事实上,根本无法配置重试之间的等待时

是否有方法指定针对特定异常重试消息的等待时间


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

这就是为什么Rebus没有-的概念的部分原因,我只是没有看到任何方法可以以一种通用且足够灵活的方式创建此函数

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

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

公共无效句柄(MyMessage){
var headers=MessageContext.GetCurrent().headers;
var deliverytrunt=headers.ContainsKey(“尝试号”)
?转换.ToInt(标题[“尝试\u否”])
: 0;
试一试{
使用(消息)删除所有内容;
}捕获(一种例外){
如果(交付尝试>5){
总线.Advanced.Routing.ForwardCurrentMessage(“错误”);
返回;
}
总线连接头(消息“尝试号”,deliveryAttempt+1);
总线延迟(TimeSpan.FromSeconds(20),消息);
}捕获(另一种例外e){
如果(交付尝试>5){
总线.Advanced.Routing.ForwardCurrentMessage(“错误”);
返回;
}
总线连接头(消息“尝试号”,deliveryAttempt+1);
总线延迟(TimeSpan.FromMinutes(2),消息);
}
}
我只是把它写在我的头上,却没有100%确定它是否真的编译了。。。但其要点是,我们跟踪在消息,
总线上的自定义头中进行了多少次传递尝试。对于每次失败的传递尝试,延迟
在适当的时间间隔内给消息打电话,当超过最大传递尝试次数时,立即将消息转发到错误队列


我希望这是有意义的:)

最近的一个例子是:

public async Task Handle(IFailed<MyMessage> message)
{
    var maxAttempts = 10;
    var optionalHeaders = new Dictionary<string, string>();
    if (message.Headers != null && message.Headers.ContainsKey("attemptNumber"))
    {
        // increment the attempt number
        var attemptNumber = int.Parse(message.Headers["attemptNumber"]);
        attemptNumber++;
        optionalHeaders.Add("attemptNumber", attemptNumber.ToString());
        if (attemptNumber > maxAttempts)
        {
            // log I give up message, message will move to dead queue
            return;
        }
    }
    else
        optionalHeaders.Add("attemptNumber", "1");

    // if message failed to process, defer processing for 5 minutes and try again
    await Bus.Defer(TimeSpan.FromMinutes(5), message.Message, optionalHeaders);
}
公共异步任务句柄(IFailed消息)
{
var=10;
var optionalHeaders=新字典();
if(message.Headers!=null&&message.Headers.ContainsKey(“attemptNumber”))
{
//增加尝试次数
var attemptNumber=int.Parse(message.Headers[“attemptNumber”]);
attemptNumber++;
optionalHeaders.Add(“attemptNumber”,attemptNumber.ToString());
如果(尝试次数>最大尝试次数)
{
//日志我放弃消息,消息将移动到死队列
返回;
}
}
其他的
可选标题。添加(“尝试编号”、“1”);
//如果消息处理失败,请将处理延迟5分钟,然后重试
等待总线延迟(TimeSpan.FromMinutes(5),message.message,OptionalHeader);
}

AttachHeader方法自发布此答案后已被删除。在新版本的Rebus中如何设置标头?IBus上发送消息的所有方法现在都接受可选参数
optionalHeaders
——例如,像
wait bus.send(消息,新字典{{“自定义标头”,“wut”})