【发布时间】:2013-10-03 08:07:03
【问题描述】:
我在迁移到 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 属性,IntPtr 事务) 在 System.Messaging.MessageQueue.SendInternal(对象 obj,MessageQueueTransaction internalTransaction,MessageQueueTransactionType transactionType) 在 C:\BuildAgent\work\d4de8921a0aabf04\src\NServiceBus.Core\Transports\Msmq\MsmqMessageSender.cs:line 60 中的 NServiceBus.Transports.Msmq.MsmqMessageSender.Send(TransportMessage 消息,地址地址) --- 内部异常堆栈跟踪结束 --- 在 C:\BuildAgent\work\d4de8921a0aabf04\src\NServiceBus.Core\Transports\Msmq\MsmqMessageSender.cs: 76 中的 NServiceBus.Transports.Msmq.MsmqMessageSender.Send(TransportMessage 消息,地址地址) 在 C:\BuildAgent\work\d4de8921a0aabf04\src\NServiceBus.Core\Faults\Forwarder\FaultManager.cs: 48 中的 NServiceBus.Faults.Forwarder.FaultManager.SendFailureMessage(TransportMessage 消息,异常 e,布尔序列化异常) --- 内部异常堆栈跟踪结束 --- 在 C:\BuildAgent\work\d4de8921a0aabf04\src\NServiceBus.Core\Faults\Forwarder\FaultManager.cs: 78 中的 NServiceBus.Faults.Forwarder.FaultManager.SendFailureMessage(TransportMessage 消息,异常 e,布尔序列化异常) 在 C:\BuildAgent\work\d4de8921a0aabf04\src\NServiceBus.Core\Unicast\Transport\FirstLevelRetries.cs: 行 71InnerExceptionNServiceBus.Unicast.Queuing.QueueNotFoundException 中的 NServiceBus.Unicast.Transport.FirstLevelRetries.TryInvokeFaultManager(TransportMessage 消息,异常异常):无法将消息发送到地址:[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 属性,IntPtr 事务) 在 System.Messaging.MessageQueue.SendInternal(对象 obj,MessageQueueTransaction internalTransaction,MessageQueueTransactionType transactionType) 在 C:\BuildAgent\work\d4de8921a0aabf04\src\NServiceBus.Core\Transports\Msmq\MsmqMessageSender.cs:line 60 中的 NServiceBus.Transports.Msmq.MsmqMessageSender.Send(TransportMessage 消息,地址地址) --- 内部异常堆栈跟踪结束 --- 在 C:\BuildAgent\work\d4de8921a0aabf04\src\NServiceBus.Core\Transports\Msmq\MsmqMessageSender.cs: 76 中的 NServiceBus.Transports.Msmq.MsmqMessageSender.Send(TransportMessage 消息,地址地址) 在 C:\BuildAgent\work\d4de8921a0aabf04\src\NServiceBus.Core\Faults\Forwarder\FaultManager.cs:line 48InnerExceptionSystem.Messaging.MessageQueueException 中的 NServiceBus.Faults.Forwarder.FaultManager.SendFailureMessage(TransportMessage 消息,异常 e,布尔序列化异常) (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,MessageQueueTransactionType transactionType) 在 C:\BuildAgent\work\d4de8921a0aabf04\src\NServiceBus.Core\Transports\Msmq\MsmqMessageSender.cs: 60 行中的 NServiceBus.Transports.Msmq.MsmqMessageSender.Send(TransportMessage 消息,地址地址)
MsmqDequeueStrategy.log 有很多:
2013-10-02 17:49:32.5579 |错误 | 57 |错误处理消息。 System.ObjectDisposedException:信号量已被释放。 在 System.Threading.SemaphoreSlim.Release(Int32 releaseCount) 在 C:\BuildAgent\work\d4de8921a0aabf04\src\NServiceBus.Core\Transports\Msmq\MsmqDequeueStrategy.cs:line 227 中的 NServiceBus.Transports.Msmq.MsmqDequeueStrategy.Action() 在 System.Threading.Tasks.Task.Execute()
FaultManager.log:
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 如下所示:
【问题讨论】:
-
它看起来像一个配置错误,因为它试图发送到的队列很明显格式不正确。你能发布你的配置吗?
-
我注意到在禁用 SecondLevelRetries 之后事情开始起作用了。但是我希望他们运行。我也尝试启用超时,我也有类似的问题。我收到错误说 2013-10-03 13:35:12.8477 |警告 | 59 |处理消息失败。 NServiceBus.Unicast.Queuing.QueueNotFoundException:无法将消息发送到地址:[administration.worker@localhost.Timeouts@localhost] ---> System.Messaging.MessageQueueException:队列不存在或您没有足够的权限执行操作。
标签: .net iis nservicebus nservicebus4