MassTransit RabbitMQ将Error Queue上消耗的一半消息移动到Error_Skipped Queue

时间:2016-11-30 13:47:13

标签: c# rabbitmq masstransit

我正在尝试将邮件和错误队列移回其源自的队列。 为此,我在Error Queue上创建了一个Consumer,然后将其发布到Required Queue。 当我尝试这个时,一半的消费消息被发布但另一半被发送到Error_Skipped队列。

我尝试过许多事情都没有成功,所以我可能很遗憾。

以下是我的代码示例:

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;
}

1 个答案:

答案 0 :(得分: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;
        }
    }
}

要获得额外信用,请复制原始邮件标题,以便保留邮件的保真度。