Статьи

Быстрый старт на Mass Transit и MSMQ на Windows

MassTransit — это шинная реализация для .NET, которая обещает легкую настройку и простоту использования . На мой взгляд, главной проблемой MassTransit является отсутствие органической документации, особенно краткого руководства, которое показывает основные концепции MassTransit. Если вы перейдете в онлайн-документацию, есть хорошая страница под названием « Покажите мне код », которая обещает быстрое начало работы с концепциями MassTransit. Проблема с этим примером состоит в том, что он показывает один фрагмент кода, который открывает шину на основе Windows MSMQ и отправляет сообщение самому себе .

На мой взгляд, это слишком упрощенный пример «Hello MassTransit» , потому что он не показывает типичную конфигурацию отправителя / получателя. Если вы попытаетесь написать другое простое консольное приложение для отправки сообщения первому, которое вы создадите, следуя инструкции «Покажите мне код», вам понадобится этот код.

Bus.Initialize(sbc =>
{
    sbc.UseMsmq();
    sbc.VerifyMsmqConfiguration();
    sbc.UseMulticastSubscriptionClient();
    sbc.ReceiveFrom("msmq://localhost/test_queue_client");
    sbc.ConfigureService<RoutingConfigurator>(
        BusServiceLayer.Session,
        rc => rc.Route<YourMessage>().To("msmq://localhost/simple_first_server")
        );
});
Bus.Instance.Probe();
Bus.Instance.WriteIntrospectionToConsole();
String read;
while (!String.IsNullOrEmpty(read = Console.ReadLine()))
{
    Bus.Instance.Publish(new YourMessage { Text = read });
}

Код действительно похож на код другого приложения, он меняет адрес ReceiveFrom и добавляет sbs.ConfigureService для маршрутизации YourMessage в очередь, используемую сервером . В этом примере стоит обратить внимание: метод ConfigureService устарел и устарел, и причина в том, что это не типичный сценарий, который MassTransit хочет решить. Проблема с этим кодом заключается в том, что он моделирует классическую модель SOA, где клиент отправляет сообщения в хорошо известный сервис, и такая ситуация настолько проста, что вам, вероятно, не нужна шина для ее обработки. Реальная функция, которую предлагает вам MassTransit, — это возможность просто отправлять и управлять сообщениями из ваших приложений, оставляя все подробности в автобусной инфраструктуре.

Чтобы создать более интересный пример, добавьте эту строку в конфигурацию первого приложения, которое подписалось на сообщение YourMessage .

sbc.UseSubscriptionService("msmq://localhost/mt_subscriptions");
sbc.UseSubscriptionService("msmq://localhost/mt_subscriptions");

Эти строки сообщают MassTransit обрабатывать подписку сообщений через очередь mt_subscription . Теперь измените консоль другого приложения, подставив вызов sbc.ConfigureService с той же строкой выше. Это избавит от необходимости указывать адрес получателя. Теперь приложение может просто публиковать сообщения на шине с помощью вызова Bus.Instance.Publish и позволить MassTransit позаботиться обо всем, особенно о маршрутизации сообщений в приложении, которое подписалось на это конкретное сообщение.

Теперь главный вопрос: каков механизм, который направляет сообщение из приложения отправителя в приложение прослушивания ? Ответ: MassTransit, и это одна из классных причин использовать шину вместо прямого использования MSMQ или WCF. Когда первое приложение подписывается на сообщение YourMessage, эта подписка отправляется в службу подписки в очереди mt_subscription, а когда другое приложение публикует сообщение, служба подписки используется, чтобы понять, куда следует направить сообщение., Служба маршрутизации проверит входящее сообщение, являющееся сообщением типа YourMessage, а затем проверит, есть ли кто-нибудь, кто зарегистрирован для прослушивания этого сообщения, и если совпадение найдено, оно направляет сообщение нужному приложению. Проблема в том, что если вы запустите две вышеупомянутые программы, вы получите неприятное исключение.

Не удалось создать службу шины: SubscriptionRouterService

Время ожидания ответа службы подписки

Причина в том, что вам нужно запустить третью программу под названием MassTransit.RuntimeServices.exe, которая фактически управляет всеми вещами маршрутизации . Если вы получили ссылку на MassTransit через NuGet, вы наверняка пропустите компоненты runtimeservice. Проще всего скачать исходный код MassTransit из GitHub, следуйте инструкциям в файле readme для сборки с build.bat, и, наконец, вы получите все необходимое в папке MassTransitbuild_outputServicesRuntimeServices

Приложению MassTransit.RuntimeServices.exe требуется база данных для хранения данных, и, поскольку она использует nhibernate, вы можете использовать практически любую базу данных, которую хотите, просто отредактируйте файл MassTransit.RuntimeService.exe.config и настройте nhibernate для доступа к предпочитаемой базе данных. В моем примере я использовал SqlExpress, просто создайте базу данных с именем MassTransitRuntimeServices и создайте схему с файлом скрипта, расположенным в srcMassTransit.RuntimeServicesSetupSQLServer.sql.После того, как база данных и файл конфигурации MassTransit.RuntimeService.Exe.config изменены правильно, вы можете запустить службу, которая в основном представляет собой простое консольное приложение, которое выполняет маршрутизацию. Помните, что вам нужно запускать его как администратор, потому что ему нужны некоторые административные права для настройки (например, создание очереди).

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