【问题标题】:MassTransit RabbitMQ moving half of Consumed messages on Error Queue to Error_Skipped QueueMassTransit RabbitMQ 将 Error Queue 上的 Consumed 消息的一半移动到 Error_Skipped Queue
【发布时间】:2016-11-30 13:47:12
【问题描述】:

我正在尝试将消息从错误队列移回它源自的队列。 为此,我在错误队列上创建了一个消费者,然后将其发布到所需队列。 当我尝试这样做时,一半的已用消息会被发布,但另一半会被发送到 Error_Skipped Queue。

我尝试了很多事情都没有成功,所以我可能缺少一些简单的东西。

以下是我的代码示例:

public class ClaimsMessage
{
    public string Description { get; set; }

    public DateTime Date { get; set; }

    public bool Handled { get; set; }
}

public class ClaimsMessageErrorConsumer : IConsumer<Fault<ClaimsMessage>>
{
    public async Task Consume(ConsumeContext<Fault<ClaimsMessage>> context)
    {
        try
        {
            await context.Publish<ClaimsMessage>(context.Message.Message);

        }
        catch (Exception e)
        {
            string error = e.Message;
        }
    }
}

public static IBusControl CreateClaimsErrorConsumerBus(string endPoint)
{
    var busControl = Bus.Factory.CreateUsingRabbitMq(cfg =>
    {
        var host = cfg.Host(new Uri("rabbitmq://localhost/"), h =>
        {
            h.Username("guest");
            h.Password("guest");
        });

        cfg.ReceiveEndpoint(host, endPoint, e =>
        {
            e.Consumer(() => new ClaimsMessageErrorConsumer());
        });
    });
    return busControl;
}

【问题讨论】:

  • 你考虑过使用a shovel?
  • 我看过一把铲子。但这有点基本。我想添加规则,这将允许我们仅将某些消息再次移回,其余的则在稍后阶段。
  • 可以试试the mailing list

标签: c# rabbitmq masstransit


【解决方案1】:

如果您将消息从错误队列移回处理队列,则不应调用Publish——这会将消息重新发送给所有订阅者。您已经知道队列名称,因此将消息直接发送回队列。您看到的是您在错误队列上创建了一个使用者,它为该消息创建了一个交换绑定。

所以,改为这样做:

sbc.ReceiveEndpoint("input_error", x =>
{
    // this prevents extra message bindings from being created
    x.BindMessageExchanges = false;

    x.Consumer<MyMover>(() => new MyMover(inputQueueAddress);
});

public class MyMover : 
    IConsumer<ClaimsMessage>
{
    public async Task Consume(ConsumeContext<ClaimsMessage> context)
    {
        try
        {
            var endpoint = await context.GetSendEndpoint(_inputQueueAddress);
            await endpoint.Send<ClaimsMessage>(context.Message);
        }
        catch (Exception e)
        {
            string error = e.Message;
        }
    }
}

要获得额外奖励,请复制原始邮件标头,以保持邮件的保真度。

【讨论】:

  • 感谢您的回复。不幸的是,它仍然做同样的事情,一条消息被放在 Claims Queue 上,另一条消息放在 Claims_error_skipped 队列上。我没有复制标题。你认为这可能是导致它的原因吗?
  • 嗨,克里斯。我创建了一个示例项目,可以在此处下载:drive.google.com/file/d/0B0FYiKs0DMyrYTJfZTcxdVlKSDg/… 它包含有关我如何复制它的分步说明。我很可能遗漏了一些东西,但我已经非常广泛地阅读了文档。
  • 如果您从错误队列中读取,您应该使用原始消息,而不是故障。您实际上已经在错误队列上为 Fault 创建了一个额外的使用者绑定,除了从队列中移动的原始消息之外,它还将获得已发布的错误。改为使用 T,并清理 RMQ 中的绑定,一切就绪。
  • 嗨,克里斯。非常感谢你的答复。这完美地工作并且通过使用实际的消息类型而不是故障完美地工作。也许更新文档可能是个好主意:docs.masstransit-project.com/en/latest/usage/… 感谢您的帮助。好好保养
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-05
  • 2018-09-22
  • 2015-06-23
  • 1970-01-01
  • 2013-12-29
相关资源
最近更新 更多