【问题标题】:NServiceBus 4 Could not forward failed message, queue not foundNServiceBus 4 无法转发失败的消息,找不到队列
【发布时间】: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


【解决方案1】:

问题出在您的初始化代码中...

.DefineEndpointName(ConfigurationManager.AppSettings["InputQueue"])

我没有在您提供的 Web.config 屏幕截图中看到这一点,但根据错误,我猜您已将其定义为 "administration.worker@localhost"。这应该只是"administration"

端点名称和输入队列不是一回事。从您的端点名称开始,NServiceBus 从那里推断出所有队列的名称。所以输入队列是{EndpointName}@localhost。如果您正在运行带有附加工作器的主节点,则工作器的输入队列为{EndpointName}.Worker@localhost。超时队列为{EndpointName}.Timeouts@localhost等。

当然,您通常不必在 NServiceBus.Host 端点中定义端点名称,但看起来您是在 Web 应用程序中自托管。

这里有更多关于文档中NServiceBus Input Queue / Endpoint Name 的信息。

【讨论】:

  • 这就是我对 NSB(端点!= InputQueue)的理解所缺少的。谢谢!
【解决方案2】:

这是一个看起来很有趣的地址:administration.worker@localhost.Retries@localhost

您可能需要在配置文件中添加:

<section name="MessageForwardingInCaseOfFaultConfig" type="NServiceBus.Config.MessageForwardingInCaseOfFaultConfig, NServiceBus.Core" />

并设置

<MessageForwardingInCaseOfFaultConfig ErrorQueue="error"/>

查看错误处理示例(如果您安装了 NServiceBus,它将位于 %ProgramFiles%\Particular Software\NServiceBus\v4.0\NServiceBus\Samples\ErrorHandling)

或在 Github https://github.com/Particular/NServiceBus/tree/develop/Samples/ErrorHandling

希望对你有帮助

【讨论】:

  • 感谢您的快速回复。但是我已经提到了条目。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-22
  • 2011-07-10
相关资源
最近更新 更多