【发布时间】:2017-02-07 22:56:22
【问题描述】:
我正在尝试使用 C# 和 RabbitMQ 在 MassTransit v3 中实现仅发布总线,其中总线没有消费者。这个概念是消息将被发布和排队,然后一个单独的微服务将从队列中消费消息。查看this SO answer,必须指定接收端点,以便消息实际排队。然而,这似乎对contradict the common gotchas in the MassTransit docs 来说是If you need to only send or publish messages, don’t create any receive endpoints。
这里是一些示例代码:
public class Program
{
static void Main(string[] args)
{
var bus = BusConfigurator.ConfigureBus();
bus.Start();
bus.Publish<IItemToQueue>(new ItemToQueue { Text = "Hello World" }).Wait();
Console.ReadKey();
bus.Stop();
}
}
public static class BusConfigurator
{
public static IBusControl ConfigureBus()
{
var bus = Bus.Factory.CreateUsingRabbitMq(cfg =>
{
var host = cfg.Host(new Uri("rabbitmq://localhost/"), hst =>
{
hst.Username("guest");
hst.Password("guest");
});
cfg.ReceiveEndpoint(host, "queuename", e =>
{
e.Consumer<MyConsumer>();
});
});
return bus;
}
}
public interface IItemToQueue
{
string Text { get; set; }
}
public class ItemToQueue : IItemToQueue
{
public string Text { get; set; }
}
public class MyConsumer : IConsumer<IItemToQueue>
{
public async Task Consume(ConsumeContext<IItemToQueue> context)
{
await Console.Out.WriteLineAsync(context.Message.Text);
}
}
在此示例中,我按预期在 RabbitMQ 队列中收到消息,这由 MyConsumer 使用,它将 Hello World 写入控制台,然后从队列中删除消息。
但是,当我从上面删除以下代码并重新运行示例时:
cfg.ReceiveEndpoint(host, RabbitMqConstants.ValidationQueue, e =>
{
e.Consumer<MyConsumer>();
});
创建了一个临时队列(使用生成的名称),并且消息似乎从未放入临时队列中。然后,当公共汽车停止时,此队列会被删除。
我遇到的问题是指定了 ReceiveEndpoint,消息将被消费并从发布者程序的队列中删除(这意味着消费者微服务不会处理排队的项目)。如果没有指定 RecieveEndpoint,则会使用一个临时队列(消费者微服务不会知道这个临时队列的名称),消息似乎永远不会排队,并且当总线停止时队列会被删除,如果程序失败了。
有an example of a send only bus in the MassTransit docs,但它非常基本,所以我想知道是否有人有任何建议?
【问题讨论】:
-
虽然您不需要发布者/发送者的接收端点,但您确实需要它们,否则没有队列绑定到消息交换,并且消息不会路由到任何地方 - 因此消失了.
标签: c# rabbitmq masstransit