不在 NServiceBus 中自动创建队列

Posted

技术标签:

【中文标题】不在 NServiceBus 中自动创建队列【英文标题】:Not creating queues automatically in NServiceBus 【发布时间】:2012-02-24 16:20:08 【问题描述】:

我正在运行 NServiceBus 3.0.0 rc2,但是当我在没有预先创建 MSMQ 的情况下启动应用程序(作为本地管理员)时,会出现以下错误:

队列不存在或您没有足够的权限执行该操作。

使用 NServiceBus 2.6 时不会发生这种情况。

下面是我的配置:

var bus = Configure.With()
    .Log4Net()
    .NinjectBuilder()
    .XmlSerializer()
    .DefiningCommandsAs(t => typeof(ICommand).IsAssignableFrom(t))
    .DefiningEventsAs(t => typeof(IEvent).IsAssignableFrom(t))
    .DefiningMessagesAs(t => typeof(IMessage).IsAssignableFrom(t))
    .MsmqTransport()
        .DefineEndpointName("subscriber.input")
        .IsTransactional(true)
        .PurgeOnStartup(false)
    .UnicastBus()
        .LoadMessageHandlers() 
        .ImpersonateSender(false)
    .CreateBus()
    .Start();

<configuration>
  <configSections>
    <section name="MsmqTransportConfig" type="NServiceBus.Config.MsmqTransportConfig, NServiceBus.Core" />
    <section name="UnicastBusConfig" type="NServiceBus.Config.UnicastBusConfig, NServiceBus.Core" />
  </configSections>    
  <MsmqTransportConfig ErrorQueue="error" NumberOfWorkerThreads="1" MaxRetries="5" />    
  <UnicastBusConfig>
    <MessageEndpointMappings>
      <add Messages="MyEvents" Endpoint="publisher.input" />
    </MessageEndpointMappings>
  </UnicastBusConfig>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>
</configuration>

我可以看到一个配置扩展方法来禁用自动创建队列但没有启用它。

如果我预先创建队列,它可以正常工作。

【问题讨论】:

今早遇到同样的问题... 【参考方案1】:

当您自行托管时,安装程​​序不会自动运行。请参阅global.asax.cs in the asyncpages sample 以获取有关如何手动执行此操作的示例。

using NServiceBus
using NServiceBus.Installation.Environments
...
Bus = Configure.With()
    .Log4Net()
    .DefaultBuilder()
    .XmlSerializer()
    .MsmqTransport()
    .IsTransactional(false)
    .PurgeOnStartup(false)
    .UnicastBus()
    .ImpersonateSender(false)
    .CreateBus()
    .Start(() => Configure.Instance.ForInstallationOn<Windows>().Install());

【讨论】:

我注意到这不会创建 TimeOut 队列。它会在需要时创建它吗?【参考方案2】:

我通过在客户端手动创建队列(自托管)解决了这个问题。

不确定,但我认为 2.x 会自动执行此操作。 主机按预期自动创建队列,但不是客户端(自托管)。

更新:就像 Andreas,Guardo camino 先生所说,您需要像这样手动调用 install;

.Start(() => Configure.Instance.ForInstallationOn<NServiceBus.Installation.Environments.Windows>().Install());

这将按预期创建队列。

【讨论】:

很好的答案。非常感谢! 5.2.6 版本和 NServiceBus 主机 6.0.0 仍然如此吗?我得到:错误 NServiceBus.Transports.Msmq.MsmqQueueCreator 无法创建队列错误@...

以上是关于不在 NServiceBus 中自动创建队列的主要内容,如果未能解决你的问题,请参考以下文章

PDF多页不在android中创建[关闭]

NServiceBus 与 Windows ServiceBus

ZooKeeper实现生产-消费者队列

在activemq中自动创建队列[关闭]

在 facebook 上自动创建群组活动

spring配置MQ自动创建队列和exchange