7

我已经使用 MassTransit 实现了一个简单的发布者/消费者集,我想让消费者从同一个队列中读取消息。但是,当我运行它时,我看到大部分消息被发送到错误队列而不是被消费。从我看到的讨论(SOForum)来看,这对于 RabbitMQ 来说应该非常简单(只需指向同一个队列),但它不起作用。是否应该设置其他配置?

这是我的发布者

public class YourMessage { public string Text { get; set; } }
public class Program
{
    public static void Main()
    {
        Console.WriteLine("Publisher");
        Bus.Initialize(sbc =>
        {
            sbc.UseRabbitMqRouting();
            sbc.ReceiveFrom("rabbitmq://localhost/test_queue");
        });
        var x = Console.Read();
        for (var i = 0; i <= 1000; i++)
        {
            Console.WriteLine("Message Number " + i);
            Bus.Instance.Publish(new YourMessage { "Message Number " + i });
        }
    }
}

我的消费者

public class YourMessage { public string Text { get; set; } }
public class Program
{
    public static void Main()
    {
        Console.WriteLine("Consumer");
        Bus.Initialize(sbc =>
        {
            sbc.UseRabbitMqRouting();
            sbc.ReceiveFrom("rabbitmq://localhost/test_queue");
            sbc.Subscribe(subs =>
            {
                var del = new Action<IConsumeContext<YourMessage>,YourMessage>((context, msg) =>
                {
                    Console.WriteLine(msg.Text);
                });
                subs.Handler<YourMessage>(del);
            });
        });
        while (true) { }
    }
}
4

3 回答 3

6

接收者/消费者和发布者不能在同一个队列中。如果您希望竞争消费者有多个消费者实例针对同一个队列运行。

我们有文档,但目前缺少此部分,所以我理解您的困惑:http ://readthedocs.org/docs/masstransit/en/latest/configuration/gotchas.html#how-to-setup-a-competing-consumer如果你成功了,文档方面的帮助会很棒。

于 2012-05-08T21:49:20.417 回答
4

因此,看起来解决方案是更改发布者中的行:

 sbc.ReceiveFrom("rabbitmq://localhost/test_queue"); 

类似于:

 sbc.ReceiveFrom("rabbitmq://localhost/test_queue_publisher"); 

这可以防止发布者竞争他们未配置为使用的消息。

于 2012-05-10T21:32:25.673 回答
1

刚刚在 GitHub 上找到了一个示例https://github.com/khalidabuhakmeh/MassTransit.ScaleOut ...

于 2014-05-15T16:51:52.510 回答