【问题标题】:Moving Error message from error queue back to original queue with Rebus使用 Rebus 将错误消息从错误队列移回原始队列
【发布时间】:2019-05-22 21:36:30
【问题描述】:

是否可以通过编程或 UI 将错误消息从错误队列移动到其原始队列?

更新

关于以下代码的问题:

1 下面的代码是否适用于发布者或订阅者或两者?

以下代码:

 Configure.With(activator)
    .Transport(t => (...)) //< use queue "error" here
    .Routing(r =>
    {
        r.AddTransportMessageForwarder(async transportMessage =>
        {
            var sourceQueue = transportMessage.Headers.TryGetValue(Headers.SourceQueue, out var result)
                ? result
                : throw new ArgumentException($"Could not find '{Headers.SourceQueue}' header");

            return ForwardAction.ForwardTo(sourceQueue);
        });
    })
    .Start();

2 Transport 下面的方法适用于我的代码。但是,上面的代码建议使用error 队列名称,它会工作吗?

如果使用上面的代码,下面指定的发布者和订阅者队列名称在哪里?

请提供 pub sub 模式的代码。

发布者:

.Transport(t => t.UseAzureServiceBus(Consts.ServiceBusConnectionString, Consts.Publisher))

订阅者:

.Transport(t=>t.UseAzureServiceBus(Consts.ServiceBusConnectionString, Consts.Subscriber1))

https://github.com/rebus-org/Rebus/wiki/Transport-message-forwarding

【问题讨论】:

    标签: rebus rebus-azureservicebus


    【解决方案1】:

    由于 Rebus 使用普通队列作为其死信队列,因此很容易以 error 作为输入队列来启动总线实例 - 然后您可以例如使用 Rebus 的内置 transport message forwarding 功能来执行您想要的消息 - 例如将它们转发到它们的源队列:

    Configure.With(activator)
        .Transport(t => (...)) //< use queue "error" here
        .Routing(r =>
        {
            r.AddTransportMessageForwarder(async transportMessage =>
            {
                var sourceQueue = transportMessage.Headers.TryGetValue(Headers.SourceQueue, out var result)
                    ? result
                    : throw new ArgumentException($"Could not find '{Headers.SourceQueue}' header");
    
                return ForwardAction.ForwardTo(sourceQueue);
            });
        })
        .Start();
    
    

    或者你想要的任何东西。

    还有一个 UI,Fleet Manager,可以做到这一点——它完全取代了对死信队列的需求,因为它将失败的消息存储在它的数据库中,并且可以将失败的消息返回到它们的源队列(或另一个队列,如果你想要的话),但只有当你是 Rebus Pro 订阅者时才可用。


    更新(包括对更新中问题的回答):

    1) AddTransportMessageForwarder 仅与接收消息的端点相关。

    2) 它是指定为.Useblablabla 方法的参数的“队列名称”。例如,对于 Azure 服务总线,它会读取

    .Transport(t => t.UseAzureServiceBus(Consts.ServiceBusConnectionString, "error"))
    

    【讨论】:

    • 应该在哪里调用带有 ForwardTo("") 的行? Fleet Manager 使用数据库作为交易信函,可以使用普通队列吗?
    • 如何指定ForwardTo方法读取的错误队列名称?请提供更多代码。
    • ForwardTo 方法不读取任何内容。我建议你用你的死信队列(例如error 作为它的输入队列 == .Transport(t =&gt; t.UseWhatever("error")))启动一个总线实例,然后实现一个转发消息的处理程序。我已经更新了答案以包含一些使用 Rebus 的内置功能的代码 forward transport messages
    • 我在 OP 的更新部分添加了一个问题。请看一看。
    • 代码.Transport(t =&gt; t.UseAzureServiceBus(Consts.ServiceBusConnectionString, "error")) 是否替换.Transport(t=&gt;t.UseAzureServiceBus(Consts.ServiceBusConnectionString, Consts.Subscriber1))?或者两者都可以与单独的 Configure.With(activator) 一起存在?两者可以存在于同一个进程中吗?
    猜你喜欢
    • 2013-07-18
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    • 2011-05-25
    • 2016-05-29
    • 2013-12-06
    • 2013-12-29
    • 1970-01-01
    相关资源
    最近更新 更多