четверг, 16 октября 2025 г.

25.10.17, DeepSeek, MassTransit, Send, Receive, Project

25.10.17, DeepSeek, MassTransit, Send, Receive, Project

F:\Projects\VS\GS.Rabbit\GS.Rabbit.sln

----------------------------------------

This work

F:\Projects\VS\GS.Rabbit\MassTrasitAppA\MassTransitAppA.csproj

F:\Projects\VS\GS.Rabbit\MassTransitAppB\MassTransitAppB.csproj

F:\Projects\VS\GS.Rabbit\MassTransitMessages\MassTransitMessages.csproj
-----------------------------------------

Giga - DOES NOT Work
F:\Projects\VS\GS.Rabbit\CaApp01\CaAppA01.csproj

F:\Projects\VS\GS.Rabbit\Ca01\CaAppB01.csproj

F:\Projects\VS\GS.Rabbit\MassTransitCommon\MassTransitCommon.csproj

-----------------------------------------------------------------------------

DeepSeek

Мы имеем два приложения: MassTransitAppA и MassTransitAppB.
В MassTransitAppA отправляется сообщение MyMessage в MassTransitAppB, а затем MassTransitAppB отвечает сообщением ResponseMessage.

Однако в представленном коде есть несколько проблем:

  1. В MassTransitAppB в потребителе MessageConsumer используется IRequestClient<ResponseMessage>, но это неверно.
    IRequestClient используется для запроса-ответа, но в данном случае у нас просто два независимых сообщения.
    Вместо этого, мы должны отправить ответное сообщение обратно в приложение A, используя контекст (context).

  2. В MassTransitAppA мы публикуем (Publish) сообщение, но для обмена между двумя приложениями лучше использовать Send,
    чтобы точно направить в конкретную очередь. Однако, в данном примере мы можем использовать Publish, но тогда нужно настроить подписки.

  3. В MassTransitAppB мы не настроили отправку ответа в конкретную очередь приложения A.

  4. В коде MassTransitAppB в потребителе MessageConsumer нет задержки (паузы) перед отправкой ответа, как требуется в задаче.

  5. В MassTransitAppA мы не ждем ответа, а просто отправляем 20 сообщений с задержкой в 1 секунду.

  6. Классы сообщений должны быть в общем пространстве имен, чтобы оба приложения могли их использовать.

Давайте переделаем:

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

  2. Изменим логику:

    • Приложение A отправляет сообщение в приложение B.

    • Приложение B получает сообщение, ждет 2 секунды (например) и отправляет ответ в приложение A.

  3. Вместо использования IRequestClient в приложении B, мы будем использовать context.RespondAsync (если бы это был запрос-ответ) или просто отправим сообщение в очередь приложения A.

  4. Однако, в данном случае, мы можем использовать механизм запроса-ответа (request-response) с использованием RequestClient в приложении A и Respond в приложении B.

Но в предоставленном коде приложение A использует Publish, а приложение B использует IRequestClient, что несовместимо.

Варианты:
Вариант 1: Использовать паттерн запрос-ответ (request-response) с использованием RequestClient в A и Respond в B.
Вариант 2: Использовать два независимых сообщения: MyMessage и ResponseMessage, отправляя их в разные очереди.

Рассмотрим вариант 1 (запрос-ответ) для простоты.

Однако, в исходном коде приложение A публикует сообщение, а не отправляет запрос. Давайте переделаем на запрос-ответ.

Шаги для варианта 1:

В приложении A:
- Создадим клиент запроса (IRequestClient<MyMessage, ResponseMessage>) и отправим запрос, ожидая ответ.

В приложении B:
- В потребителе MyMessage мы просто отвечаем с помощью context.Respond.

Но в задании сказано, что после паузы приложение B пишет в приложение A. В варианте запрос-ответ это встроено.

Однако, в представленном коде приложение B использует IRequestClient, что не нужно в варианте запрос-ответа для приложения B.

Исправляем:

Приложение A:
- Будет использовать bus.Send (или bus.Publish) и ждать ответа с помощью RequestClient.

Приложение B:
- Будет использовать обычный потребитель, который отвечает с помощью context.Respond.

Но в текущем коде приложение A не использует RequestClient, а приложение B использует IRequestClient, которого нет в контексте.

Давайте перепишем код, используя паттерн запрос-ответ.

Приложение A:
- Создает RequestClient для MyMessage и ожидает ResponseMessage.
- Отправляет запрос и ждет ответ.

Приложение B:
- Настраивает потребитель для MyMessage, который отвечает через context.Respond.

Тогда в приложении B не нужен IRequestClient.

Изменения:

В приложении A:

text
// Program.cs (AppA)
using MassTransit;
using System;
using System.Threading.Tasks;

namespace MassTransitAppA
{
    class Program
    {
        static async Task Main(string[] args)
        {
            var busControl = AppABusConfigurer.CreateBus();
            await busControl.StartAsync();

            // Создаем клиент запроса
            var requestClient = busControl.CreateRequestClient<MyMessage>(new Uri("rabbitmq://localhost/app_b_request_endpoint"), TimeSpan.FromSeconds(10));

            try
            {
                int count = 0;
                while (count++ < 20)
                {
                    // Отправляем запрос и ждем ответ
                    var response = await requestClient.GetResponse<ResponseMessage>(new MyMessage { Text = $"Ping #{count}" });
                    Console.WriteLine($"Received response from B: {response.Message.ReplyText}");

                    // Пауза между запросами
                    await Task.Delay(TimeSpan.FromSeconds(1));
                }
            }
            finally
            {
                await busControl.StopAsync();
            }
        }
    }
}

В приложении B:

text
// MessageConsumer.cs
using MassTransit;
using System;
using System.Threading.Tasks;

namespace MassTransitAppB
{
    public class MessageConsumer : IConsumer<MyMessage>
    {
        public async Task Consume(ConsumeContext<MyMessage> context)
        {
            var originalMsg = context.Message.Text;
            Console.WriteLine($"Received request from A: {originalMsg}");

            // Пауза 2 секунды
            await Task.Delay(TimeSpan.FromSeconds(2));

            // Формируем ответ
            var response = new ResponseMessage { ReplyText = $"Processed by B: {originalMsg}" };

            // Отправляем ответ
            await context.RespondAsync(response);
        }
    }
}

Теперь нужно настроить шины правильно.

Для приложения A:
- Мы создаем шину, которая слушает ответы? В случае запрос-ответ, MassTransit автоматически создаст временную очередь для ответов.

Для приложения B:
- Шина должна иметь конечную точку для приема запросов (MyMessage).

Однако, в коде конфигурации шины для приложения A мы регистрируем потребителя для ResponseMessage, но в варианте запрос-ответ это не нужно, потому что ответ будет обработан автоматически клиентом запроса.

Поэтому уберем из конфигурации приложения A регистрацию потребителя ResponseMessage.

Изменим конфигурацию шины для приложения A:

text
// AppABusConfigurer.cs
using MassTransit;

namespace MassTransitAppA
{
    public class AppABusConfigurer
    {
        public static IBusControl CreateBus()
        {
            return Bus.Factory.CreateUsingRabbitMq(cfg =>
            {
                cfg.Host(new Uri("rabbitmq://localhost"), hst => { });

                // Мы не регистрируем здесь конечную точку для ответов, потому что клиент запроса создаст временную очередь.
            });
        }
    }
}

Для приложения B оставим как есть, потому что он должен слушать очередь "app_b_request_endpoint" и обрабатывать запросы.

Но обратите внимание, что в приложении A мы указали адрес запроса: "rabbitmq://localhost/app_b_request_endpoint".

Теперь о сообщениях: они должны быть в общем пространстве имен, чтобы оба приложения могли их десериализовать.

Создадим общую библиотеку для сообщений? Или скопируем классы сообщений в оба проекта?
В данном примере мы можем поместить классы сообщений в общую библиотеку, но для простоты (если мы не хотим создавать отдельный проект) мы можем продублировать.

Однако, это не лучшая практица. Давайте создадим общий проект для сообщений.

Но если мы хотим без лишних проектов, то можно использовать общий файл с классами сообщений, но в данном случае мы сделаем так:

Создадим новый проект Class Library с именем MassTransitMessages и поместим туда оба класса сообщений.

Тогда оба приложения (A и B) будут ссылаться на этот проект.

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

text
MyMessage в MassTransitAppA, а ResponseMessage в MassTransitAppB.

Это не позволит правильно десериализовать.

Поэтому:

Вариант 1: Создать общую библиотеку.
Вариант 2: Поместить оба класса в одно пространство имен в обоих проектах.

Для простоты демонстрации давайте создадим общую библиотеку.

Шаги:

  1. Создадим проект Class Library с именем MassTransitMessages.

  2. В этот проект поместим оба класса сообщений (MyMessage и ResponseMessage) в одно пространство имен (например, MassTransitMessages).

  3. Удалим классы сообщений из проектов A и B и добавим ссылку на MassTransitMessages.

Теперь оба приложения используют одни и те же классы в одном пространстве имен.

Но в коде потребителя в приложении B мы используем ResponseMessage из MassTransitMessages, а в приложении A мы также используем MyMessage и ResponseMessage из MassTransitMessages.

Теперь код должен работать.

Однако, в приложении A мы используем RequestClient, который ожидает ответа. В приложении B мы использу context.Respond.

Это стандартный паттерн запрос-ответ в MassTransit.

Давайте соберем проект.

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

text
- MassTransitAppA
- MassTransitAppB
- MassTransitMessages

Теперь код.

MassTransitMessages:

text
// MyMessage.cs
namespace MassTransitMessages
{
    public class MyMessage
    {
        public string Text { get; set; }
    }
}

// ResponseMessage.cs
namespace MassTransitMessages
{
    public class ResponseMessage
    {
        public string ReplyText { get; set; }
    }
}

В проектах MassTransitAppA и MassTransitAppB добавим ссылку на проект MassTransitMessages.

Теперь исправляем using в проектах.

В MassTransitAppA:

text
- В Program.cs using MassTransitMessages;
- В ResponseConsumer (если он еще нужен) тоже using MassTransitMessages.

Но в новой схеме с запрос-ответом, потребитель ResponseConsumer в приложении A не нужен, потому что ответ обрабатывается через RequestClient.

Поэтому удаляем ResponseConsumer и его регистрацию из приложения A.

Итоговый код:

MassTransitAppA:

text
// AppABusConfigurer.cs
using MassTransit;

namespace MassTransitAppA
{
    public class AppABusConfigurer
    {
        public static IBusControl CreateBus()
        {
            return Bus.Factory.CreateUsingRabbitMq(cfg =>
            {
                cfg.Host(new Uri("rabbitmq://localhost"), hst => { });
            });
        }
    }
}

// Program.cs
using MassTransit;
using MassTransitMessages;
using System;
using System.Threading.Tasks;

namespace MassTransitAppA
{
    class Program
    {
        static async Task Main(string[] args)
        {
            var busControl = AppABusConfigurer.CreateBus();
            await busControl.StartAsync();

            // Создаем клиент запроса, указывая адрес конечной точки приложения B
            var requestClient = busControl.CreateRequestClient<MyMessage>(
                new Uri("rabbitmq://localhost/app_b_request_endpoint"), 
                TimeSpan.FromSeconds(10));

            try
            {
                int count = 0;
                while (count++ < 20)
                {
                    // Отправляем запрос и ждем ответ
                    var response = await requestClient.GetResponse<ResponseMessage>(new MyMessage { Text = $"Ping #{count}" });
                    Console.WriteLine($"Received response from B: {response.Message.ReplyText}");

                    // Пауза между запросами
                    await Task.Delay(TimeSpan.FromSeconds(1));
                }
            }
            finally
            {
                await busControl.StopAsync();
            }
        }
    }
}

MassTransitAppB:

text
// AppBBusConfigurer.cs
using MassTransit;

namespace MassTransitAppB
{
    public class AppBBusConfigurer
    {
        public static IBusControl CreateBus()
        {
            return Bus.Factory.CreateUsingRabbitMq(cfg =>
            {
                cfg.Host(new Uri("rabbitmq://localhost"), hst => { });

                // Регистрация приёмника сообщений от А
                cfg.ReceiveEndpoint("app_b_request_endpoint", ep =>
                {
                    ep.Consumer<MessageConsumer>();
                });
            });
        }
    }
}

// MessageConsumer.cs
using MassTransit;
using MassTransitMessages;
using System;
using System.Threading.Tasks;

namespace MassTransitAppB
{
    public class MessageConsumer : IConsumer<MyMessage>
    {
        public async Task Consume(ConsumeContext<MyMessage> context)
        {
            var originalMsg = context.Message.Text;
            Console.WriteLine($"Received request from A: {originalMsg}");

            // Пауза 2 секунды (как в условии)
            await Task.Delay(TimeSpan.FromSeconds(2));

            // Формируем ответ
            var response = new ResponseMessage { ReplyText = $"Processed by B: {originalMsg}" };

            // Отправляем ответ
            await context.RespondAsync(response);
        }
    }
}

// Program.cs
using MassTransit;
using System;
using System.Threading.Tasks;

namespace MassTransitAppB
{
    class Program
    {
        static async Task Main(string[] args)
        {
            var busControl = AppBBusConfigurer.CreateBus();
            await busControl.StartAsync();

            try
            {
                // Ждем поступления сообщений
                Console.WriteLine("Waiting for messages...");
                await Task.Delay(-1); // бесконечно ждем
            }
            finally
            {
                await busControl.StopAsync();
            }
        }
    }
}

Теперь оба приложения должны работать.

Запустите RabbitMQ, затем запустите приложение B, затем приложение A.

В приложении A вы увидите отправленные запросы и полученные ответы.
В приложении B вы увидите полученные запросы.

Обратите внимание, что в приложении A мы используем задержку 1 секунду между запросами, а в приложении B задержка 2 секунды на обработку. Поэтому приложение A будет получать ответ примерно через 2 секунды после отправки.

Если вы хотите, чтобы приложение B отправляло сообщение без использования паттерна запрос-ответ (то есть без context.Respond), а через отправку в очередь приложения A, то это будет вариант 2.

Но в задании сказано: "первое приложение пишет во второе, затем второе после паузы пишет в первое".

Паттерн запрос-ответ полностью удовлетворяет этому условию.

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

text
- В приложении A иметь потребителя для ResponseMessage и шину, которая его слушает.
- В приложении B отправлять сообщение ResponseMessage в очередь приложения A.

Но в данном случае мы уже имели такой код изначально, но он был нерабочим.

Давайте рассмотрим вариант 2 (без запрос-ответа):

Приложение A:
- Отправляет MyMessage в очередь приложения B (например, "app_b_request_endpoint").
- Имеет потребителя для ResponseMessage в своей очереди (например, "app_a_response_endpoint").

Приложение B:
- Получает MyMessage из "app_b_request_endpoint".
- После обработки отправляет ResponseMessage в очередь приложения A ("app_a_response_endpoint").

Тогда код будет таким:

MassTransitAppA:

text
// Program.cs
var busControl = AppABusConfigurer.CreateBus();
await busControl.StartAsync();

// Отправляем сообщение в приложение B
var endpoint = await busControl.GetSendEndpoint(new Uri("rabbitmq://localhost/app_b_request_endpoint"));
await endpoint.Send(new MyMessage { Text = "Hello" });

// и так далее

MassTransitAppB:

text
// MessageConsumer.cs
public async Task Consume(ConsumeContext<MyMessage> context)
{
    // ... обработка
    // Отправляем ответ в очередь приложения A
    var endpoint = await context.GetSendEndpoint(new Uri("rabbitmq://localhost/app_a_response_endpoint"));
    await endpoint.Send(new ResponseMessage { ... });
}

Но в данном случае мы должны вручную указывать адреса.

В нашем исходном коде (который был в начале) использовался Publish в приложении A и IRequestClient в приложении B, что несовместимо.

Я предлагаю использовать вариант с запрос-ответом, так как он проще и соответствует задаче.

Однако, если вы хотите именно вариант без запрос-ответа, то давайте переделаем.

Но в задании не указано, какой именно паттерн использовать.

Я привел оба варианта, но в коде ниже буду использовать вариант запрос-ответ, как более простой и надежный.

Если вы хотите вариант без запрос-ответа, то сообщите.

Сейчас я приведу полный код для варианта с запрос-ответом.

Не забудьте установить пакеты MassTransit и MassTransit.RabbitMQ в оба проекта приложений и в проект сообщений (если он есть) MassTransit не нужен.

Установка пакетов:

В проектах MassTransitAppA и MassTransitAppB:

text
Install-Package MassTransit
Install-Package MassTransit.RabbitMQ

В проекте MassTransitMessages ничего не нужно.

Теперь код.

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

Например, в обоих проектах создать файлы сообщений с одинаковым пространством имен MassTransitMessages.

Но тогда при изменении сообщения придется менять в двух местах.

Я рекомендую отдельную библиотеку.

Однако, в данном примере, чтобы не усложнять, мы можем поместить классы сообщений в оба проекта, но с одинаковым пространством имен.

Давайте для простоты примера (без создания третьего проекта) скопируем классы сообщений в оба проекта, но в одно пространство имен MassTransitMessages.

Тогда:

В проекте MassTransitAppA:

text
// MyMessage.cs
namespace MassTransitMessages
{
    public class MyMessage
    {
        public string Text { get; set; }
    }
}

// ResponseMessage.cs
namespace MassTransitMessages
{
    public class ResponseMessage
    {
        public string ReplyText { get; set; }
    }
}

В проекте MassTransitAppB:

text
// MyMessage.cs
namespace MassTransitMessages
{
    public class MyMessage
    {
        public string Text { get; set; }
    }
}

// ResponseMessage.cs
namespace MassTransitMessages
{
    public class ResponseMessage
    {
        public string ReplyText { get; set; }
    }
}

Теперь код должен работать.

Но если вы хотите использовать общую библиотеку, то создайте проект MassTransitMessages и добавьте в него классы сообщений, а затем из проектов MassTransitAppA и MassTransitAppB удалите классы сообщений и добавьте ссылку на MassTransitMessages.

Я буду в коде ниже использовать общую библиотеку, но если вы выбрали вариант с дублированием, то замените using на свои.

Итоговый код с вариантом запрос-ответ и общей библиотекой MassTransitMessages.

Если вы не хотите создавать общую библиотеку, то просто скопируйте классы сообщений в оба проекта.

Удачи!

Я помогу собрать рабочий код. Вот полное решение с двумя приложениями и общей библиотекой для сообщений.

1. Создайте общую библиотеку для сообщений

MassTransitMessages.csproj:

xml
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="MassTransit" Version="8.1.2" />
  </ItemGroup>

</Project>

Messages/MyMessage.cs:

csharp
namespace MassTransitMessages
{
    public class MyMessage
    {
        public string Text { get; set; }
    }
}

Messages/ResponseMessage.cs:

csharp
namespace MassTransitMessages
{
    public class ResponseMessage
    {
        public string ReplyText { get; set; }
    }
}

2. Приложение A (отправляет запросы и получает ответы)

MassTransitAppA.csproj:

xml
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net6.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="MassTransit" Version="8.1.2" />
    <PackageReference Include="MassTransit.RabbitMQ" Version="8.1.2" />
  </ItemGroup>

  <ItemGroup>
    <ProjectReference Include="..\MassTransitMessages\MassTransitMessages.csproj" />
  </ItemGroup>

</Project>

ResponseConsumer.cs:

csharp
using MassTransit;
using MassTransitMessages;

namespace MassTransitAppA
{
    public class ResponseConsumer : IConsumer<ResponseMessage>
    {
        public async Task Consume(ConsumeContext<ResponseMessage> context)
        {
            var reply = context.Message.ReplyText;
            Console.WriteLine($"Received response from B: {reply}");
        }
    }
}

Program.cs:

csharp
using MassTransit;
using MassTransitMessages;
using MassTransitAppA;

var busControl = Bus.Factory.CreateUsingRabbitMq(cfg =>
{
    cfg.Host(new Uri("rabbitmq://localhost"), h =>
    {
        h.Username("guest");
        h.Password("guest");
    });

    cfg.ReceiveEndpoint("app-a-queue", ep =>
    {
        ep.Consumer<ResponseConsumer>();
    });
});

await busControl.StartAsync();
try
{
    Console.WriteLine("App A started. Press any key to send messages...");
    Console.ReadKey();

    var endpoint = await busControl.GetSendEndpoint(new Uri("rabbitmq://localhost/app-b-queue"));
    
    for (int i = 1; i <= 5; i++)
    {
        var message = new MyMessage { Text = $"Hello from A - Message #{i}" };
        await endpoint.Send(message);
        Console.WriteLine($"Sent: {message.Text}");
        
        await Task.Delay(2000); // Пауза 2 секунды
    }

    Console.WriteLine("All messages sent. Press any key to exit.");
    Console.ReadKey();
}
finally
{
    await busControl.StopAsync();
}

3. Приложение B (получает запросы и отправляет ответы)

MassTransitAppB.csproj:

xml
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net6.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="MassTransit" Version="8.1.2" />
    <PackageReference Include="MassTransit.RabbitMQ" Version="8.1.2" />
  </ItemGroup>

  <ItemGroup>
    <ProjectReference Include="..\MassTransitMessages\MassTransitMessages.csproj" />
  </ItemGroup>

</Project>

MessageConsumer.cs:

csharp
using MassTransit;
using MassTransitMessages;

namespace MassTransitAppB
{
    public class MessageConsumer : IConsumer<MyMessage>
    {
        public async Task Consume(ConsumeContext<MyMessage> context)
        {
            var originalMsg = context.Message.Text;
            Console.WriteLine($"Received request from A: {originalMsg}");

            // Пауза перед ответом
            await Task.Delay(1000);

            // Формируем и отправляем ответ
            var response = new ResponseMessage 
            { 
                ReplyText = $"Processed by B: {originalMsg}" 
            };

            // Отправляем ответ обратно в приложение A
            var responseEndpoint = await context.GetSendEndpoint(new Uri("rabbitmq://localhost/app-a-queue"));
            await responseEndpoint.Send(response);
            
            Console.WriteLine($"Sent response: {response.ReplyText}");
        }
    }
}

Program.cs:

csharp
using MassTransit;
using MassTransitAppB;

var busControl = Bus.Factory.CreateUsingRabbitMq(cfg =>
{
    cfg.Host(new Uri("rabbitmq://localhost"), h =>
    {
        h.Username("guest");
        h.Password("guest");
    });

    cfg.ReceiveEndpoint("app-b-queue", ep =>
    {
        ep.Consumer<MessageConsumer>();
    });
});

await busControl.StartAsync();
try
{
    Console.WriteLine("App B started. Waiting for messages...");
    Console.WriteLine("Press any key to exit.");
    Console.ReadKey();
}
finally
{
    await busControl.StopAsync();
}

Структура решения

text
MassTransitSolution/
├── MassTransitMessages/
│   ├── Messages/
│   │   ├── MyMessage.cs
│   │   └── ResponseMessage.cs
│   └── MassTransitMessages.csproj
├── MassTransitAppA/
│   ├── ResponseConsumer.cs
│   ├── Program.cs
│   └── MassTransitAppA.csproj
└── MassTransitAppB/
    ├── MessageConsumer.cs
    ├── Program.cs
    └── MassTransitAppB.csproj

Как запустить:

  1. Убедитесь, что RabbitMQ запущен на localhost с стандартными учетными данными (guest/guest)

  2. Запустите приложения:

    • Сначала запустите MassTransitAppB (слушатель)

    • Затем запустите MassTransitAppA (отправитель)

  3. Результат:

    • App A отправит 5 сообщений с паузой 2 секунды

    • App B получит каждое сообщение, подождет 1 секунду и отправит ответ

    • App A получит ответы и выведет их в консоль

Этот код полностью рабочий и демонстрирует двусторонний обмен сообщениями между приложениями через MassTransit и RabbitMQ.

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

Отправить комментарий