首页 文章

NServiceBus 4无法转发失败的消息,未找到队列

提问于
浏览
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.Message.Message.Message.Message.Message.Message.Message.Message.Message.Message.Message.Message.Message.Message.Message.Message.Message.MessageMue (对象obj,MessageQueueTransaction internalTransaction,MessageQueueTransactionType transactionType)位于c:\ BuildAgent \ work \ d4de8921a0aabf04 \ src \ NServiceBus.Core \ Transports \ Msmq \ MsmqMessageSender.cs中的NServiceBus.Transports.Msmq.MsmqMessageSender.Send(TransportMessage消息,地址) :第60行---内部异常堆栈跟踪结束---位于c:\ BuildAgent \ work \ d4de8921a0aabf04 \ src \ NServiceBus.Core \ Transports中的NServiceBus.Transports.Msmq.MsmqMessageSender.Send(TransportMessage消息,地址) Msmq \ MsmqMessageSender.cs:位于c:\ Bui的NServiceBus.Faults.Forwarder.FaultManager.SendFailureMessage(TransportMessage消息,Exception e,Boolean serializationException)的第76行ldAgent \ 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行,位于c:中的NServiceBus.Unicast.Transport.FirstLevelRetries.TryInvokeFaultManager(TransportMessage message,Exception exception) \ BuildAgent \ work \ d4de8921a0aabf04 \ src \ NServiceBus.Core \ Unicast \ Transport \ FirstLevelRetries.cs:line 71InnerExceptionNServiceBus.Unicast.Queuing.QueueNotFoundException:无法向地址发送消息:[administration.worker @ localhost.Retries @ localhost] - - > System.Messaging.MessageQueueException:队列不存在或您没有足够的权限来执行操作 . System.Messaging.Message.Message.Message.Message.Message.Message.Message.Message.Message.Message.Message.Message.Message.Message.Message.Message.Message.MessageMue (对象obj,MessageQueueTransaction internalTransaction,MessageQueueTransactionType transactionType)位于c:\ BuildAgent \ work \ d4de8921a0aabf04 \ src \ NServiceBus.Core \ Transports \ Msmq \ MsmqMessageSender.cs中的NServiceBus.Transports.Msmq.MsmqMessageSender.Send(TransportMessage消息,地址) :第60行---内部异常堆栈跟踪结束---位于c:\ BuildAgent \ work \ d4de8921a0aabf04 \ src \ NServiceBus.Core \ Transports中的NServiceBus.Transports.Msmq.MsmqMessageSender.Send(TransportMessage消息,地址) Msmq \ MsmqMessageSender.cs:位于c:\ Bui的NServiceBus.Faults.Forwarder.FaultManager.SendFailureMessage(TransportMessage消息,Exception e,Boolean serializationException)的第76行ldAgent \ work \ d4de8921a0aabf04 \ src \ NServiceBus.Core \ Faults \ Forwarder \ FaultManager.cs:line 48InnerExceptionSystem.Messaging.MessageQueueException(0x80004005):队列不存在或您没有足够的权限来执行操作 . System.Messaging.Message.Message.Message.Message.Message.Message.Message.Message.Message.Message.Message.Message.Message.Message.Message.Message.Message.MessageMue (对象obj,MessageQueueTransaction internalTransaction,MessageQueueTransactionType transactionType)atNS:serviceBus.Transports.Msmq.MsmqMessageSender.Send(TransportMessage消息,地址地址)位于c:\ BuildAgent \ work \ d4de8921a0aabf04 \ src \ NServiceBus.Core \ Transports \ Msmq \ MsmqMessageSender.cs:第60行

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中的NServiceBus.Transports.Msmq.MsmqDequeueStrategy.Action()中:第227行在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看起来像这样:
Web.config

2 回答

  • 3

    问题出在您的Init代码中......

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

    我猜你已经定义为 "administration.worker@localhost" . 这应该只是 "administration" .

    endpoints 名称和输入队列不是一回事 . 从您的 endpoints 名称开始,NServiceBus从那里推断出所有队列的名称 . 所以输入队列是 {EndpointName}@localhost . 如果're running a master node with an attached worker, the worker'的输入队列是 {EndpointName}.Worker@localhost . 超时队列是 {EndpointName}.Timeouts@localhost 等 .

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

    以下是有关文档NServiceBus Input Queue / Endpoint Name的更多信息 .

  • 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

    希望这可以帮助

相关问题