我正在运行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>
我可以看到一个配置扩展方法来禁用自动创建队列,但没有用于启用它。
如果我预先创建队列,它可以正常工作。
答案 0 :(得分:15)
自托管时,安装程序不会自动运行。有关如何手动执行此操作的示例,请参阅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());
答案 1 :(得分:11)
我通过手动在客户端创建队列(自托管)来解决这个问题。
不确定,但我认为2.x会自动执行此操作。 主机正在按预期自动创建队列,但不是客户端(自托管)。
更新:就像Andreas,Senor guardo camino所说,你需要像这样手动调用安装;
.Start(() => Configure.Instance.ForInstallationOn<NServiceBus.Installation.Environments.Windows>().Install());
这将按预期创建队列。