我正在尝试在MassTransit v3中使用C#和RabbitMQ实现只发布总线,其中总线没有使用者。这个概念是消息将被发布和排队,然后一个单独的微服务将消耗队列中的消息。看看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
。使用C#和RabbitMQ在MassTransit v3中实现只发布总线
下面是一些示例代码:
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但它是非常基本的,所以我想知道如果有人有任何建议?
虽然您不需要发布者/发件人的接收端点,但确实需要它们在某个地方,否则就没有绑定到消息交换的队列,而且这些消息也不会路由到任何地方 - 从而消失。 –