RabbitMQ的MassTransit 3.0.1(预发行版)无法使用与2.9.9相同的配置/设置来处理消息

时间:2015-03-06 15:40:54

标签: c# rabbitmq masstransit

这是有效的MT 2.9.9版本:

public sealed class DiagnosticConsumer : Consumes<DiagnosticMessage>.All
{
    public void Consume(DiagnosticMessage message)
    {
        Console.WriteLine("Got {0} with timestamp {1}", message.Message, message.Timestamp);
    }
}

总线设置:

var bus = ServiceBusFactory.New(sbc =>
{
    sbc.UseRabbitMq(r => r.ConfigureHost(new Uri("rabbitmq://localhost/notifications/tests"),
        c =>
        {
            c.SetUsername("test_user");
            c.SetPassword("testuser123");
        }));
    sbc.ReceiveFrom("rabbitmq://localhost/notifications/tests");
    sbc.Subscribe(s =>
                  {
                      s.Consumer<DiagnosticConsumer>();
                  });
});


using (bus)
{
    bus.Publish(new DiagnosticMessage { Message = "Test msg", Timestamp = DateTimeOffset.Now });
    Console.WriteLine("Published!");
    Console.ReadLine();
}   

按预期工作,使用RabbitMQ管理时,我可以看到以下内容: RabbitMQ charts for MT 2.9.9

现在,使用MT 3.0.1-alpha以及MassTransit.RabbitMQ 3.0.1-alpha和以下设置:

public sealed class DiagnosticConsumer : IConsumer<DiagnosticMessage>
{
    public async Task Consume(ConsumeContext<DiagnosticMessage> context)
    {
        Console.WriteLine("Got message: {0}", context.Message);
    }
}

总线配置:

public static async Task RunQueue()
{
    var bus = Bus.Factory
                 .CreateUsingRabbitMq(c =>
                 {
                     var host =
                         c.Host(
                             new Uri(
                                 "rabbitmq://localhost/notifications"),
                             conf =>
                             {
                                 conf.Username("test_user");
                                 conf.Password("testuser123");
                             });
                     c.ReceiveEndpoint(host, "tests", conf =>
                     {
                         conf.Consumer<DiagnosticConsumer>();
                     });
                 });

    using (var handle = await bus.Start())
    {
        await bus.Publish(new DiagnosticMessage{ Message = "Pinging!", Timestamp = DateTimeOffset.Now});
        Console.WriteLine("Waiting to finish...");
        Console.ReadLine();
        await handle.Stop();
    }
}

在这种情况下,没有真正发生的事情,消费者永远不会得到消息,管理控制台也讲述了另一个故事: RabbitMQ charts for MT 3.0.1-alpha

在这两种情况下,它都是完全相同的队列和设置,这本身就非常简单。我是否有任何不妥之处,我必须修复使用最新版本的MassTransit,还是只是alpha版本的错误?

2 个答案:

答案 0 :(得分:1)

这是此类问题的第二个报告,您可以检查消息类型与队列的绑定吗?我相信alpha有一个问题,默认情况下发布的消息类型没有正确绑定到队列。另一位用户上周报告了同样的事情,我在我的名单上用干净的虚拟主机进行调查。

由于Send有效,Publish没有,所以可能是问题。

答案 1 :(得分:0)

我找到了自己问题的半答案。

如果通过ISendEndpoint

完成,则显然可以发布作品。

var address = new Uri("rabbitmq://localhost/notifications/tests");
var endpoint = await bus.GetSendEndpoint(address);
await endpoint.Send(new DiagnosticMessage{ Message = "Pinging!", Timestamp = DateTimeOffset.Now});

在这种情况下,消息传递成功。

话虽这么说,我不确定Publish的当前形式是什么,或者为什么传递它的消息没有传递,特别是在消费者使用ConsumeContext<>时。如果您想要安排邮件,它似乎也会导致问题,因为它们是使用Publish进行安排的。

直到行为改变或其他人对为什么所有这一切都有更好的答案,我想我找到了解决我当前问题的方法。

[编辑]

正如Chris Patterson在his answer中指出的那样,消息的交换类型没有绑定到队列。通过管理控制台手动设置它使Publish起作用。