我使用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()
}
}
}
答案 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