Я пытаюсь реализовать шину только для публикации в MassTransit v3 с C # и RabbitMQ, где у шины нет потребителя. Идея состоит в том, что сообщения будут публиковаться и помещаться в очередь, а затем отдельный микросервис будет потреблять сообщения из очереди. Глядя на этот ответ SO, необходимо указать конечные точки приема, чтобы сообщения действительно в очереди. Однако это, похоже, противоречит распространенным ошибкам в Документы MassTransit, в которых указано 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 используется временная очередь (и микросервис-потребитель не будет знать имя этой временной очереди), сообщение никогда не попадает в очередь, и очередь удаляется при остановке шины, что было бы плохо, если бы программа вышла из строя.
В документах MassTransit есть пример шины только для отправки но это довольно просто, поэтому мне было интересно, есть ли у кого-нибудь предложения?