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 выглядит так: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

Надеюсь это поможет

Другие вопросы по тегам