Подписка на очередь сообщений с помощью NServiceBus - работа в консольном приложении;не работает в веб-приложении ASP.NET MVC - PullRequest
1 голос
/ 15 июля 2011

У меня работает экспериментальный проект NServiceBus, который имеет:

  • MyProject.Core - издатель сообщений, использующий NServiceBus.Host.exe
  • MyProject.Subscriber = подписчик сообщения 1, использующий NServiceBus.Host.exe
  • MyProject.ConsoleSubscriber - консольное приложение .NET с явной инициализацией и подпиской
  • MyProject.WebApp - веб-приложение ASP.NET MVC 2

Когда я запускаю проект, размещенный подписчик NSB получает сообщения от ядра - но веб-приложение и консольное приложение не получают; точка останова в обработчике сообщений никогда не срабатывает, и я не получаю никаких диагностических данных в окне вывода VS.

Консольное приложение имеет следующий код:

using System;
using MyProject.Messages.PublishedByCore;
using NServiceBus;

namespace MyProject.ConsoleSubscriber {
    class Program {
        static void Main(string[] args) {

            var bus = NServiceBus.Configure.With()
                .Log4Net()
                .DefaultBuilder()
                .XmlSerializer()
                .MsmqTransport()
                    .IsTransactional(false)
                    .PurgeOnStartup(false)
                .UnicastBus()
                    .ImpersonateSender(false)
                .CreateBus()
                .Start();
            bus.Subscribe<FileChangedMessage>();
            while (Console.ReadLine() != null) { }
        }
    }

    public class FileChangedMessageHandler : IHandleMessages<FileChangedMessage> {
        public void Handle(FileChangedMessage message) {
            Console.WriteLine(message.FilePath);
        }
    }
}

и следующий файл App.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <section name="MsmqTransportConfig" type="NServiceBus.Config.MsmqTransportConfig, NServiceBus.Core" />
        <section name="UnicastBusConfig" type="NServiceBus.Config.UnicastBusConfig, NServiceBus.Core" />
    </configSections>
    <MsmqTransportConfig InputQueue="MyConsoleClient" ErrorQueue="error" NumberOfWorkerThreads="1" MaxRetries="5" />
    <UnicastBusConfig>
        <MessageEndpointMappings>
            <add Messages="MyProject.Messages.PublishedByCore" Endpoint="MyProjectCoreInputQueue" />
        </MessageEndpointMappings>
    </UnicastBusConfig>
</configuration>

Global.asax.cs веб-приложения выглядит следующим образом:

using System.Diagnostics;
using System.Web.Mvc;
using System.Web.Routing;
using MyProject.Messages.PublishedByCore;
using NServiceBus;

namespace MyProject.WebApp {
    public class MvcApplication : System.Web.HttpApplication {
        public static void RegisterRoutes(RouteCollection routes) {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            routes.MapRoute(
                "Default", // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
            );
        }

        public static IBus Bus { get; set; }

        protected void Application_Start() {
            Bus = NServiceBus.Configure.WithWeb()
                .Log4Net()
                .DefaultBuilder()
                .XmlSerializer()
                .MsmqTransport()
                    .IsTransactional(false)
                    .PurgeOnStartup(false)
                .UnicastBus()
                    .ImpersonateSender(false)
                .CreateBus()
                .Start();
            Bus.Subscribe<FileChangedMessage>(); RegisterRoutes(RouteTable.Routes);
        }
    }

    public class FileChangedMessageHandler : IHandleMessages<FileChangedMessage> {
        public void Handle(FileChangedMessage message) {
            Debug.WriteLine(message.FilePath);
        }
    }
}

и соответствующий раздел файла Web.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <configSections>
        <sectionGroup name="system.web.extensions" type="System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
            <sectionGroup name="scripting" type="System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
                <section name="scriptResourceHandler" type="System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication" />
                <sectionGroup name="webServices" type="System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
                    <section name="jsonSerialization" type="System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="Everywhere" />
                    <section name="profileService" type="System.Web.Configuration.ScriptingProfileServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication" />
                    <section name="authenticationService" type="System.Web.Configuration.ScriptingAuthenticationServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication" />
                    <section name="roleService" type="System.Web.Configuration.ScriptingRoleServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication" />
                </sectionGroup>
            </sectionGroup>
        </sectionGroup>
        <section name="MsmqTransportConfig" type="NServiceBus.Config.MsmqTransportConfig, NServiceBus.Core" />
        <section name="UnicastBusConfig" type="NServiceBus.Config.UnicastBusConfig, NServiceBus.Core" />
    </configSections>
    <MsmqTransportConfig InputQueue="MyWebClient" ErrorQueue="error" NumberOfWorkerThreads="1" MaxRetries="5" />
    <UnicastBusConfig>
        <MessageEndpointMappings>
            <add Messages="MyProject.Messages.PublishedByCore" Endpoint="MyProjectCoreInputQueue" />
        </MessageEndpointMappings>
    </UnicastBusConfig>

Насколько я вижу, код конфигурации и инициализации у подписчиков в Интернете и на консоли идентичен, кроме Congfigure.With() против Configure.WithWeb() - поэтому я не могу понять, почему это не работает. Есть ли какая-то дополнительная конфигурация, необходимая для фактической подписки на очередь сообщений из веб-приложения .NET, которая мне не хватает?

1 Ответ

3 голосов
/ 15 июля 2011

D'oh.

Оба приложения должны вызывать .LoadMessageHandlers () - и мне нужно научиться различать журналирование диагностики NServiceBus и мой собственный вывод обработчика сообщений ...

var bus = NServiceBus.Configure.With()
    .Log4Net()
    .DefaultBuilder()
    .XmlSerializer()
    .MsmqTransport()
        .IsTransactional(false)
        .PurgeOnStartup(false)
    .UnicastBus()
        // THIS IS THE LINE THAT MAKES IT WORK!
        .LoadMessageHandlers()
        .ImpersonateSender(false)
    .CreateBus()
    .Start();

Упс.

...