MassTransit RabbitMq Отправка сообщений - PullRequest
1 голос
/ 17 февраля 2020

Я не могу понять, как указать Exchange и Queue в моей задаче GetSendEndpoint()) при отправке / публикации сообщений?

В соответствии с документацией MassTransit https://masstransit-project.com/usage/producers.html#send вы можете указать обмен и очередь, например

GetSendEndpoint(new Uri("queue:input-queue"))

Однако я могу сделать только одно или другое?

Есть ли альтернативный способ отправки с указанием exchange и очереди?

Я делаю это в Asp. Net Ядро, вот моя конфигурация:

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
   services.AddMassTransit();

   services.AddSingleton(p => Bus.Factory.CreateUsingRabbitMq(cfg =>
   {
         cfg.Host("rabbitmq://localhost", h =>
         {
             h.Username("admin");
             h.Password("admin");
         });
   }));

   services.AddSingleton<IBus>(p => p.GetRequiredService<IBusControl>());
   services.AddSingleton<IHostedService, BusService>();
}

И вот как отправить сообщение

var endpoint = await _bus.GetSendEndpoint(new Uri(queue:Test.Queue));
await endpoint.Send(new Message()
{
     Text = "This is a test message"
});

Как видите, я могу указать только имя очереди.

Ответы [ 2 ]

2 голосов
/ 17 февраля 2020

Если вы указываете обмен, только брокер объявляет только обмен. Сообщение будет отправлено непосредственно в обмен.

"exchange:your-exchange-name"

Если вы укажете очередь, будет объявлена ​​очередь вместе с обменом с тем же именем, и обмен будет привязан к очереди. Сообщения будут доставлены на биржу с тем же именем, которая доставит их в очередь.

"queue:your-queue-name"

Если вы хотите другой обмен и имя очереди, вы можете указать оба, используя:

"exchange:your-exchange-name?bind=true&queue=your-queue-name"

Или вы могли бы упростить, но это немного сбивает с толку две очереди:

"queue:your-exchange-name&queue=your-queue-name"
1 голос
/ 18 февраля 2020

Чтение ответа Криса здесь Массовый транзит: нет потребителя

Кажется, что Exchanges are created by MassTransit when publishing messages, based on the message types. Publishing does not create any queues. Queues are where messages are stored for delivery to consumers.

и Queues are created when receive endpoints are added to a bus. For the consumers, handlers, and sagas added to a receive endpoint, the exchanges are created and bound so that messages published to the exchanges are received by the receive endpoint (via the queue).

Так что, если мой Для издателя не определена конечная точка приема, и все отправленные мной сообщения будут потеряны, поскольку не будет очередей или привязок?

Дальнейшее чтение здесь https://groups.google.com/forum/#! Topic / masstransit-обсудить / oVzZkg1os9o , кажется, еще раз подтверждает это.

Итак, основываясь на приведенной выше ссылке, чтобы достичь того, что я хочу, т.е. создать обмен и связать его с очередью, мне нужно будет указать его в Uri как таковом

var sendEndpoint = bus.GetSendEndpoint(new Uri("rabbitmq://localhost/vhost1/exchange1?bind=true&queue=queue1"));

, где exchange1 - это Exchange, queue1 - это очередь, а bind=true будет привязывать очередь к бирже.

Если придерживаться первоначального дизайна MT, Потребители должны быть запущены до того, как настроить обмены и очереди, прежде чем Производитель сможет начать публикацию? Кажется, это дает издателю меньше гибкости?

...