2013-10-03 69 views
1

我在迁移到NService 4(4.0.4)后遇到问题。当消息处理失败时,它看起来像整个NServiceBus停止并且没有做任何工作(来自MSMQ的消息不再被消耗)。 寻找到日志后,我发现了以下错误:NServiceBus 4无法转发失败的消息,找不到队列

NServiceBus.log:

2013年10月2日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(Object obj,MessageQueueTransaction internalTransaction,MessageQueueTransactionType transactionType) at NServiceBus.Transports.Msmq.MsmqMessageSender.Send(TransportMessage message,Address address)in c:\ BuildAgent \ work \ d4de8921a0aabf04 \ src \ NServiceBus.Core \ Transports \ Msmq \ MsmqMessageSender.cs:60行 ---内部异常堆栈跟踪--- 在c:\ BuildAgent \ w中NServiceBus.Transports.Msmq.MsmqMessageSender.Send(TransportMessage消息,地址)的结束org \ d4de8921a0aabf04 \ src \ NServiceBus.Core \ Transports \ Msmq \ MsmqMessageSender.cs:line 76 at NServiceBus.Faults.Forwarder.FaultManager.SendFailureMessage(TransportMessage message,Exception e,Boolean serializationException)in c:\ BuildAgent \ work \ d4de8921a0aabf04 \ src \ NServiceBus.Core \ Faults \ Forwarder \ FaultManager.cs:line 48 --- End of internal exception stack trace --- at NServiceBus.Faults.Forwarder.FaultManager.SendFailureMessage(TransportMessage message,Exception e,Boolean serializationException )in c:\ BuildAgent \ work \ d4de8921a0aabf04 \ src \ NServiceBus.Core \ Faults \ Forwarder \ FaultManager.cs:line 78 at NServiceBus.Unicast.Transport.FirstLevelRetries.TryInvokeFaultManager(TransportMessage message,Exception exception)in c:\ BuildAgent \ work \ d4de8921a0aabf04 \ src \ NServiceBus.Core \ Unicast \ Transport \ FirstLevelRetries.cs:line 71InnerExceptionNServiceBus.Unicast.Queuin g.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(Object obj,MessageQueueTransaction internalTransaction,MessageQueueTransactionType transactionType) at NServiceBus.Transports.Msmq.MsmqMessageSender.Send(TransportMessage message,Address address)in c:\ BuildAgent \ work \ d4de8921a0aabf04 \ src \ NServiceBus.Core \ Transports \ Msmq \ MsmqMessageSender.cs:60行 ---内部异常堆栈跟踪--- 在c:\ BuildAgent \ w中NServiceBus.Transports.Msmq.MsmqMessageSender.Send(TransportMessage消息,地址)的结束org \ d4de8921a0aabf04 \ src \ NServiceBus.Core \ Transports \ Msmq \ MsmqMessageSender.cs:line 76 at NServiceBus.Faults.Forwarder.FaultManager.SendFailureMessage(TransportMessage message,Exception e,Boolean serializationException)in c:\ BuildAgent \ work \ d4de8921a0aabf04 \ src \ NServiceBus.Core \ Faults \ 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(Object obj,MessageQueueTransaction internalTransaction,MessageQueueTransactionType transactionType) at NServiceBus.Transports.Msmq.MsmqMessageSender.Send(TransportMessage message,Address address)in c:\ BuildAgent \ work \ d4de8921a0aabf04 \ src \ NServiceBus.Core \ Transports \ Msmq \ MsmqMessageSender.cs:line 60

MsmqDequeueStrategy.log有很多:

2013-10-02 17:49:32.5579 |错误| 57 |处理消息时出错。 System.ObjectDisposedException:信号量已被丢弃。 (C:\ BuildAgent \ work \ d4de8921a0aabf04 \ src \ NServiceBus.Core \ Transports \ Msmq \ MsmqDequeueStrategy.cs)中的NServiceBus.Transports.Msmq.MsmqDequeueStrategy.Action()处的System.Threading.SemaphoreSlim.Release(Int32 releaseCount) 在System.Threading.Tasks.Task.Execute()

FaultManager.log线227 :

2013年10月2日17:49:31.5746 |致命的| 110 |无法将失败的消息转发到错误队列'administration.worker @ localhost.Retries @ localhost',因为找不到它。

我的init 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

+0

它看起来像一个配置错误,因为它试图发送到队列是相当明显畸形。你能发布你的配置吗? –

+0

我注意到,在禁用SecondLevelRetries之后,事情开始奏效。不过,我希望他们运行。 另外我试过启用超时,我也有类似的问题。我得到错误说2013-10-03 13:35:12.8477 |警告| 59 |处理失败的消息。 NServiceBus.Unicast.Queuing.QueueNotFoundException:无法发送消息到地址:[administration.worker @ localhost.Timeouts @ localhost] ---> System.Messaging.MessageQueueException:队列不存在或者您没有足够的权限执行操作。 – stachu

回答

3

的问题是在你的初始化代码...

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

我不明白,在你提供你的web.config的截图,但是基于错误,我猜你有那个定义为"[email protected]"。这应该只有"administration"

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

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

下面是关于NServiceBus Input Queue/Endpoint Name从文档的更多信息。

+0

这就是我在理解NSB(Endpoint!= InputQueue)时所缺少的。谢谢! – stachu

0

这是一个有趣的寻找地址:administration.worker @ localhost.Retries @本地

你可能需要在你的配置文件中加入:

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

,并设置

<MessageForwardingInCaseOfFaultConfig ErrorQueue="error"/> 

看一看错误处理样本(如果安装NServiceBus这将是到%ProgramFiles%\特定软件\ NServiceBus \ V4.0 \ NServiceBus \样本\ ErrorHandling中)

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

希望这有助于

+0

感谢您的快速响应。不过,我已经提到了条目。 – stachu

相关问题