2013-10-03 166 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

相關問題