NServiceBus 4 Не удалось переслать сообщение об ошибке, очередь не найдена
У меня возникают проблемы после перехода на NService 4 (4.0.4). Когда происходит сбой обработки сообщений, похоже, что весь NServiceBus останавливается и не выполняет никакой работы (сообщения от MSMQ больше не используются). После просмотра логов я обнаружил следующие ошибки:
NServiceBus.log:
2013-10-02 17: 49: 31.5786 | ФАТАЛЬНО | 110 | Диспетчеру ошибок не удалось обработать сообщение с ошибкой с идентификатором aa32dce1-f408-4f6d-b448-a24b0118ec27 System.InvalidOperationException: не удалось переслать сообщение с ошибкой в очередь ошибок "administrator.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.StaleSaessMessagePessMessagePessMessagePessMessagePessMessageMessageMessageMessageMessageMessageMessageMessageMessageMessageMessageMessageMessageMessagePM (Объект obj, MessageQueueTransaction internalTransaction, MessageQueueTransactionType TransactionsType) в NServiceBus.Transports.Msmq.MsmqMessageSender.Send(сообщение TransportMessage, адресный адрес) в каталоге c:\BuildAgent\work\d4de8921a0aabfore.m_service_MS_S_MS_S_R_S_MS_R_S_MS_S_R_S_S_MS_S_S_S_S_S_S_SMS_S_S_R_S: строка 60 --- Конец внутренней трассировки стека исключений --- в NServiceBus.Transports.Msmq.MsmqMessageSender.Send(сообщение TransportMessage, адрес Address) в c:\BuildAgent\work\d4de8921a0aabf04\src\NServiceBus.Core\Transports\Msmq\MsmqMessageSender.cs: строка 76 в NServiceBus.Faults.Forwarder.FaultManager.SendFailureMessage(сообщение TransportMessage, исключение e, логическая сериализация Exception) в c:\BuildAgent\work\d4de8921a0aabf04\src\NServiceBus.Core\Faults\Forwarder\FaultManager.cs: строка 48 --- Конец внутренней трассировки стека исключений --- в NServiceBus.Faults.Forwarder.FaultManager.SendFailureMessage(сообщение TransportMessage, исключение, исключение, Boolean serializationException) в c:\BuildAgent\work\d4de8921a0aabf04 \ src \ NServiceBus.Core \ Faults \ Forwarder \ FaultManager.cs: строка 78 в NServiceBus.Unicast.Transport.FirstLevelRetries.TryInception Исключение в транспортном средстве: сообщение об исключении транспорта в хранилище: сообщение об ошибке:\BuildAgent\work\d4de8921a0aabf04\src\NServiceBus.Core\Unicast\Transport\FirstLevelRetries.cs: строка 71InnerExceptionNServiceBus.Unicast.Queuing.QueueNotFoundException: не удалось отправить сообщение на адрес: [Administration.workries @ localhost @ localhost @ localhost -> System.Messaging.MessageQueueException: очередь не существует или у вас недостаточно прав для выполнения операции. в System.Messaging.MessageQueue.MQCacheableInfo.get_WriteHandle() в System.Messaging.MessageQueue.StaleSafeSendMessage(свойства MQPROPS, транзакция ITransaction) в System.Messaging.MessageQueue.StaleSaessMessagePessMessagePessMessagePessMessagePessMessageMessageMessageMessageMessageMessageMessageMessageMessageMessageMessageMessageMessageMessagePM (Объект obj, MessageQueueTransaction internalTransaction, MessageQueueTransactionType TransactionsType) в NServiceBus.Transports.Msmq.MsmqMessageSender.Send(сообщение TransportMessage, адресный адрес) в каталоге c:\BuildAgent\work\d4de8921a0aabfore.m_service_MS_S_MS_S_R_S_MS_R_S_MS_S_R_S_S_MS_S_S_S_S_S_S_SMS_S_S_R_S: строка 60 --- Конец внутренней трассировки стека исключений --- в NServiceBus.Transports.Msmq.MsmqMessageSender.Send(сообщение TransportMessage, адрес Address) в c:\BuildAgent\work\d4de8921a0aabf04\src\NServiceBus.Core\Transports\Msmq\MsmqMessageSender.cs: строка 76 в NServiceBus.Faults.Forwarder.FaultManager.SendFailureMessage(сообщение TransportMessage, исключение e, логическая сериализация Exception) в 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.StaleSaessMessagePessMessagePessMessagePessMessagePessMessageMessageMessageMessageMessageMessageMessageMessageMessageMessageMessageMessageMessageMessagePM (Объект obj, MessageQueueTransaction internalTransaction, MessageQueueTransactionType TransactionsType) в NServiceBus.Transports.Msmq.MsmqMessageSender.Send(сообщение TransportMessage, адресный адрес) в каталоге c:\BuildAgent\work\d4de8921a0aabfore.m_service_MS_S_MS_S_R_S_MS_R_S_MS_S_R_S_S_MS_S_S_S_S_S_S_SMS_S_S_R_S: строка 60
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 \ переводчик MSC: MSC в 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());
РЕДАКТИРОВАТЬ: больше информации. Я принимаю NSB в IIS. Я публикую, отправляю и обрабатываю сообщения в нем.
Web.config выглядит так:
2 ответа
Проблема в вашем коде Init...
.DefineEndpointName(ConfigurationManager.AppSettings["InputQueue"])
Я не вижу этого на скриншоте вашего Web.config, который вы предоставили, но, исходя из ошибки, я предполагаю, что вы определили это как "administration.worker@localhost"
, Это должно быть только "administration"
,
Имя конечной точки и входная очередь - это не одно и то же. Начиная с вашего имени конечной точки, NServiceBus выводит имена всех очередей оттуда. Таким образом, входная очередь {EndpointName}@localhost
, Если вы работаете с главным узлом с подключенным работником, входная очередь рабочего {EndpointName}.Worker@localhost
, Очередь ожидания {EndpointName}.Timeouts@localhost
, так далее.
Конечно, вам обычно не нужно определять имя конечной точки в конечной точке NServiceBus.Host, но похоже, что вы самостоятельно размещаетесь в веб-приложении.
Вот больше информации о Входной очереди NServiceBus / Имя конечной точки из документов.
Это забавно выглядящий адрес: 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
Надеюсь это поможет