1

迁移到 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 看起来像这样: 网页配置

4

2 回答 2

3

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

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

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

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

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

以下是文档中有关NServiceBus 输入队列/端点名称的更多信息。

于 2013-10-03T18:30:31.537 回答
0

这是一个看起来很有趣的地址: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

希望这可以帮助

于 2013-10-03T10:57:13.330 回答