MassTransit 3如何将消息显式发送到错误队列

时间:2017-03-15 13:15:24

标签: system.reactive masstransit

我使用MassTransit和Reactive Extensions批量传输来自队列的消息。由于行为与普通消费者不同,因此如果消息失败了x次,我需要能够将消息发送到错误队列。

我查看了MassTransit源代码,并在google群组上发布,无法找到anwser。

这是否在ConsumeContext界面上可用?或者这甚至可能吗?

这是我的代码。我删除了一些以简化它。

_busControl = Bus.Factory.CreateUsingRabbitMq(cfg =>
{
    var host = cfg.Host(new Uri("rabbitmq://localhost/"), h =>
    {
        h.Username("guest");
        h.Password("guest");

    });

    cfg.UseInMemoryScheduler();

    cfg.ReceiveEndpoint(host, "customer_update_queue", e =>
    {
       var _observer = new ObservableObserver<ConsumeContext<Customer>>();

       _observer.Buffer(TimeSpan.FromMilliseconds(1000)).Subscribe(OnNext);

       e.Observer(_observer);       
   });
});


 private void OnNext(IList<ConsumeContext<Customer>> messages)
 {
    foreach (var consumeContext in messages)
    {
        Console.WriteLine("Content: " + consumeContext.Message.Content);

        if (consumeContext.Message.RetryCount > 3)
        {
            // I want to be able to send to the error queue     
            consumeContext.SendToErrorQueue()
        }
    }            
 }

1 个答案:

答案 0 :(得分:0)

我通过使用与MassTransit混合的RabbitMQ客户端找到了解决方法。由于在使用Observable时无法抛出异常,因此不会创建任何错误队列。我使用RabbitMQ客户端手动创建它,如下所示。

ConnectionFactory factory = new ConnectionFactory();
factory.HostName = "localhost";
factory.UserName = "guest";
factory.Password = "guest";

using (IConnection connection = factory.CreateConnection())
{
    using (IModel model = connection.CreateModel())
    {
        string exchangeName = "customer_update_queue_error";
        string queueName = "customer_update_queue_error";
        string routingKey = "";

        model.ExchangeDeclare(exchangeName, ExchangeType.Fanout);
        model.QueueDeclare(queueName, false, false, false, null);
        model.QueueBind(queueName, exchangeName, routingKey);
    }
}

如果发送部分失败x次,发送部分将直接发送到消息队列。

consumeContext.Send(new Uri("rabbitmq://localhost/customer_update_queue_error"), consumeContext.Message);

希望批量功能很快就会实现,我可以使用它。 https://github.com/MassTransit/MassTransit/issues/800