1

我第一次努力使用 NServiceBus,没有 ESB 背景。在阅读了博客文章、示例、文档等之后。我无法弄清楚为什么我的 C# 类库不会发送消息。在 Bus.Send(msg) 我得到“没有为消息 Messages.TraceStatement 指定目的地。无法发送消息。检查配置文件中的 UnicastBusConfig 部分并确保消息类型存在 MessageEndpointMapping。”

但首先,关于我的架构和我正在尝试做的事情,因为它与我在那里看到的任何示例都不同。

我的意图是像 Ben 一样使用 SignalR 和 NServiceBus ,但有两个主要变化:

  1. 不使用 NServiceBus.Host.exe。我想要一个仅 Web 的,没有控制台的实现。
  2. 出于实时代码跟踪的目的,从中间层类库发送消息。换句话说,我想在我的代码周围添加 Bus.Send 语句,从而能够在网页上查看代码执行跟踪语句(它们只是开发人员设置的临时字符串)。

假设我没有将 NServiceBus 误解到我所设想的甚至不可能的程度(或对该技术的滥用),我想弄清楚如何从类库发送消息。目前我有一个“Managers” dll,它有一个 app.config 文件,如下所示:

<configuration>
  <configSections>
    <section name="MsmqTransportConfig" type="NServiceBus.Config.MsmqTransportConfig, NServiceBus.Core" />
    <section name="UnicastBusConfig" type="NServiceBus.Config.UnicastBusConfig, NServiceBus.Core" />
  </configSections>

    <MsmqTransportConfig InputQueue="TerminalQueue" ErrorQueue="TerminalErrorQueue" NumberOfWorkerThreads="1" MaxRetries="5"/>

    <UnicastBusConfig>
        <MessageEndpointMappings>
            <add Messages="Messages" Endpoint="WorkerQueue" />
        </MessageEndpointMappings>
    </UnicastBusConfig>
</configuration>

注意:在 Ben 的项目中,我将“Commands”重命名为“Messages”。因此(参考我帖子顶部的错误消息),据我所知,我已经正确定义了 MessageEndpointMapping。(我验证了队列存在于 MSMQ 中。)

谁能告诉我我做错了什么?

此外,我非常感谢有关如何删除 NServiceBus.Host.exe 依赖项的输入(请参阅 Ben 示例中的 Worker 项目)。理想情况下,类库将发送消息(就像 Ben 的项目中的终端所做的那样),Web 应用程序作为订阅者能够处理事件并使用 SignalR 显示消息。

更新

目前我已经放弃了类库项目中的配置 DLL,因为我认为 Web.config 会覆盖它。所以我的 Web.config 现在看起来有以下内容:

<section name="microsoft.web.services3" type="Microsoft.Web.Services3.Configuration.WebServicesConfiguration, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<section name="MsmqTransportConfig" type="NServiceBus.Config.MsmqTransportConfig, NServiceBus.Core" />
<section name="MsmqSubscriptionStorageConfig" type="NServiceBus.Config.MsmqSubscriptionStorageConfig, NServiceBus.Core" />
<section name="UnicastBusConfig" type="NServiceBus.Config.UnicastBusConfig, NServiceBus.Core" />

<MsmqTransportConfig
      InputQueue="WebQueue"
      ErrorQueue="WebErrorQueue"
      NumberOfWorkerThreads="1"
      MaxRetries="5"
/>

<UnicastBusConfig>
    <MessageEndpointMappings>
        <add Messages="MessageEvents" Endpoint="WebQueue" />
    </MessageEndpointMappings>
</UnicastBusConfig>

我还根据http://docs.particular.net/nservicebus/messaging/publish-subscribe/创建了一个名为“NServiceBus_Subscriptions”的私有电车队列。

我的 Global.asax.cs 有这个:

Bus = Configure
    .WithWeb()
        .DefaultBuilder()
        .XmlSerializer()
        .MsmqTransport()
        .PurgeOnStartup(false)
        .UnicastBus()
        .LoadMessageHandlers()
            .MsmqSubscriptionStorage()
        .CreateBus()
        .Start();
4

2 回答 2

1

如果您的意图是在本地发送消息,那么您的配置是错误的。它应该是:

<MsmqTransportConfig InputQueue="WebAppQueue" ErrorQueue="TerminalErrorQueue" NumberOfWorkerThreads="1" MaxRetries="5"/>

<UnicastBusConfig>
    <MessageEndpointMappings>
        <add Messages="Messages" Endpoint="WebAppQueue" />
    </MessageEndpointMappings>
</UnicastBusConfig>

但是,无需添加MessageEndpointMappings用于本地发送。你可以打电话Bus.SendLocal来做这件事。如果您要发布和订阅事件(通过Bus.Publish),那么您确实需要映射。

我最近发布了一个示例,它可以在一台主机上完成所有操作。唯一的区别是您不会使用通用主机,因此您应该咨询http://docs.particular.net/samples/web/asp-mvc-application/

于 2011-10-13T00:20:51.417 回答
1

这似乎是一个有趣的练习。它的实用性可能有点可疑。毕竟,不能保证 MSMQ 消息以任何特定顺序到达,因此很难根据收到的消息确定类库中发生了什么。我是否正确阅读正在检查的类库和诊断网页都在同一个 Web 应用程序中?如果是这样,使用简单的 .NET 事件/委托来进行跟踪会更直接,然后使用 SignalR 将它们传递到网页。

但就像我说的,这是一个有趣的练习,所以...

正如 Ben 的回答所示,Web 应用程序向自身发送消息的配置是让 MsmqTransportConfig InputQueue(它接收消息的总线的“主基地”)匹配 UnicastBusConfig MessageEndpointMappings 端点队列(它将向该队列发送该类型的消息) , 或订阅该类型的消息。)

另一个缺失的细节可能是您用于在 Web 应用程序中托管总线的流畅配置。您需要确保您的配置包含Hosting NServiceBus in your own Process 中.LoadMessageHandlers()所示的行。Web 上的许多示例都忽略了这一点,因为它们是不处理消息的仅发送端点。

另一种选择是使用该Bus.SendLocal()方法,该方法通常帮助端点将消息包拆分为不同的消息,以便每个消息都可以拥有自己的事务,但可以在本练习中使用以摆脱对消息端点映射的要求.

于 2011-10-13T15:09:53.920 回答