迁移到 NService 4 (4.0.4) 后我遇到了问题。当消息处理失败时,看起来整个 NServiceBus 正在停止并且不做任何工作(不再使用来自 MSMQ 的消息)。查看日志后,我发现以下错误:
NServiceBus.log:
2013-10-02 17:49:31.5786 | 致命 | 110 | 故障管理器无法处理 ID 为 aa32dce1-f408-4f6d-b448-a24b0118ec27 System.InvalidOperationException 的失败消息:无法将失败消息转发到错误队列“administration.worker@localhost.Retries@localhost”,因为找不到它。---> NServiceBus.Unicast.Queuing.QueueNotFoundException: 无法将消息发送到地址:[administration.worker@localhost.Retries@localhost] ---> System.Messaging.MessageQueueException: 队列不存在或您没有足够的权限来执行操作。在 System.Messaging.MessageQueue.MQCacheableInfo.get_WriteHandle() 在 System.Messaging.MessageQueue.StaleSafeSendMessage(MQPROPS 属性,ITransaction 事务) 在 System.Messaging.MessageQueue.StaleSafeSendMessage(MQPROPS 属性,Core\Transports\Msmq\MsmqMessageSender.cs:C:\BuildAgent\work\d4de8921a0aabf04\src\NServiceBus.Core\Faults 中 NServiceBus.Faults.Forwarder.FaultManager.SendFailureMessage(TransportMessage 消息,异常 e,布尔序列化异常)的第 76 行Forwarder\FaultManager.cs:line 48InnerExceptionSystem.Messaging.MessageQueueException (0x80004005):队列不存在或您没有足够的权限执行操作。在 System.Messaging.MessageQueue.MQCacheableInfo.get_WriteHandle() 在 System.Messaging.MessageQueue.StaleSafeSendMessage(MQPROPS 属性,ITransaction 事务) 在 System.Messaging.MessageQueue.StaleSafeSendMessage(MQPROPS 属性,IntPtr 事务) 在 System.Messaging.MessageQueue.SendInternal (对象 obj,MessageQueueTransaction internalTransaction,
MsmqDequeueStrategy.log 有很多:
2013-10-02 17:49:32.5579 | 错误 | 57 | 错误处理消息。System.ObjectDisposedException:信号量已被释放。在 System.Threading.SemaphoreSlim.Release(Int32 releaseCount) 在 NServiceBus.Transports.Msmq.MsmqDequeueStrategy.Action() 在 c:\BuildAgent\work\d4de8921a0aabf04\src\NServiceBus.Core\Transports\Msmq\MsmqDequeueStrategy.cs:line 227在 System.Threading.Tasks.Task.Execute()
故障管理器日志:
2013-10-02 17:49:31.5746 | 致命 | 110 | 无法将失败的消息转发到错误队列“administration.worker@localhost.Retries@localhost”,因为找不到它。
我按如下方式初始化 NSB:
Configure.Serialization.Xml();
Configure.Features.Enable<TimeoutManager>();
Configure.Features.Enable<Sagas>();
var conf = Configure.With(assemblies)
.CustomConfigurationSource(new BusConfigSource(assemblies))
.DefineEndpointName(ConfigurationManager.AppSettings["InputQueue"])
.CastleWindsorBuilder(container)
.MessageForwardingInCaseOfFault()
.UseInMemoryTimeoutPersister()
.UseTransport<Msmq>()
.PurgeOnStartup(false)
.FileShareDataBus(WebConfigurationManager.AppSettings["NServiceBusFileShare"])
.UnicastBus()
.LoadMessageHandlers()
.MsmqSubscriptionStorage()
.CreateBus()
.Start(() => Configure.Instance.ForInstallationOn<Windows>().Install());
编辑:更多信息。我在 IIS 中托管 NSB。我在其中发布、发送和处理消息。
Web.config 看起来像这样: