这是有效的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管理时,我可以看到以下内容:
现在,使用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();
}
}
在这种情况下,没有真正发生的事情,消费者永远不会得到消息,管理控制台也讲述了另一个故事:
在这两种情况下,它都是完全相同的队列和设置,这本身就非常简单。我是否有任何不妥之处,我必须修复使用最新版本的MassTransit,还是只是alpha版本的错误?
答案 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
起作用。