Как разделить демонстрацию MassTransit на приложения производителя и потребителя

#c# #.net #masstransit

#c# #.net #masstransit

Вопрос:

Я пытаюсь разделить демонстрацию MassTransit (https://masstransit-project.com/MassTransit/quickstart.html ) на два отдельных приложения, но мое приложение-потребитель не получает никаких сообщений.

Я создал 3 проекта: отправка, получение и сообщения. Отправка содержит Send класс, который является моим кодом производителя, получение содержит Receive класс, который является моим кодом потребителя, а сообщения содержат классы для моих сообщений.

Вот мой Send класс:

 using MassTransit;
using Messages;
using System;

namespace MassTransitTest
{
    class Send
    {
        static void Main(string[] args)
        {
            var bus = Bus.Factory.CreateUsingRabbitMq(config =>
            {
                var host = config.Host(new Uri("rabbitmq://localhost"), c =>
                {
                    c.Username("guest");
                    c.Password("guest");
                });
            });

            bus.Start();

            Console.WriteLine("Publishing message");

            bus.Publish(new TextMessage() { Text = "Testing 12345" });

            bus.Stop();

            Console.ReadLine();
        }
    }
}
  

вот мой Receive класс:

 using MassTransit;
using Messages;
using System;

namespace Receive
{
    class Receive
    {
        static void Main(string[] args)
        {
            var bus = Bus.Factory.CreateUsingRabbitMq(config =>
            {
                var host = config.Host(new Uri("rabbitmq://localhost"), c =>
                {
                    c.Username("guest");
                    c.Password("guest");
                });

                config.ReceiveEndpoint(host, "queue", endpoint =>
                {
                    endpoint.Handler<TextMessage>(context =>
                    {
                        return Console.Out.WriteLineAsync($"{context.Message.Text}");
                    });
                });
            });

            bus.Start();

            Console.WriteLine("Receive listening for messages");

            Console.ReadLine();

            bus.Stop();
        }
    }
}
  

Наконец, вот мой TextMessage класс:

 using System;

namespace Messages
{
    public class TextMessage
    {
        public string Text { get; set; }
    }
}
  

Когда я отправляю сообщение из своего Send класса, я хотел бы получить его и вывести на консоль из своего Receive класса.

Комментарии:

1. Если вы посмотрите на консоль управления брокером, видите ли вы очереди и обмены, а также соответствующие привязки для типа сообщения?

2. Да, @ChrisPatterson. Но я не вижу никаких сообщений, достигающих этих обменов / очередей после вызова bus.Publish()

Ответ №1:

Я понял это! Publish это асинхронное сообщение, которое возвращает Task , поэтому мне нужно было await , и тогда все заработало. Моя Send программа завершала работу до того, как сообщение было отправлено.