【问题标题】:Subscribing to queue messages with NServiceBus - working in console app; doesn't work in ASP.NET MVC web application使用 NServiceBus 订阅队列消息 - 在控制台应用程序中工作;在 ASP.NET MVC Web 应用程序中不起作用
【发布时间】:2011-07-15 15:11:37
【问题描述】:

我有一个正在运行的实验性 NServiceBus 项目:

  • MyProject.Core - 使用 NServiceBus.Host.exe 的消息发布者
  • MyProject.Subscriber = 使用 NServiceBus.Host.exe 的消息订阅者 1
  • MyProject.ConsoleSubscriber - 具有显式初始化和订阅的 .NET 控制台应用
  • MyProject.WebApp - ASP.NET MVC 2 Web 应用程序

当我启动项目时,NSB 托管的订阅者正在接收来自核心的消息 - 但 Web 应用程序和控制台应用程序没有;消息处理程序中的断点永远不会被命中,并且我在 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>

Web 应用程序的 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() 之外,Web 和控制台订阅者中的配置和初始化代码是相同的 - 所以我不明白为什么这不起作用。从我缺少的 .NET Web 应用程序实际订阅消息队列是否需要一些额外的配置?

【问题讨论】:

    标签: msmq nservicebus publish-subscribe


    【解决方案1】:

    哦。

    两个应用程序都需要调用 .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();
    

    哎呀。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-21
      • 1970-01-01
      • 1970-01-01
      • 2021-03-13
      • 2019-06-23
      相关资源
      最近更新 更多