2013-10-03 2 views
1

У меня возникают проблемы после перехода на NService 4 (4.0.4). Когда обработка сообщений терпит неудачу, похоже, что весь NServiceBus останавливается и не выполняет никакой работы (сообщения от MSMQ больше не потребляются). После просмотра в журналах, я нашел следующие ошибки:NServiceBus 4 Не удалось переправить сообщение об ошибке, очередь не найдена

NServiceBus.log:

2013-10-02 17: 49: 31.5786 | FATAL | 110 | Менеджер неисправностей не смог обработать сообщение об ошибке с идентификатором aa32dce1-f408-4f6d-b448-a24b0118ec27 System.InvalidOperationException: Не удалось переправить сообщение об ошибке в очередь ошибок «administrator.worker @ localhost.Retries @ localhost», поскольку его не удалось найти. ---> NServiceBus.Unicast.Queuing.QueueNotFoundException: Не удалось отправить сообщение по адресу: [administrator.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) в NServiceBus.Transports.Msmq.MsmqMessageSender.Send (сообщение TransportMessage, адрес адреса) в c: \ BuildAgent \ work \ d4de8921a0aabf04 \ src \ NServiceBus.Core \ Transports \ Msmq \ MsmqMessageSender.cs: строка 60 --- Конец внутренней стеки стека исключений --- в NServiceBus.Transports.Msmq.MsmqMessageSender.Send (сообщение TransportMessage, адрес адреса) в c: \ BuildAgent \ w ork \ d4de8921a0aabf04 \ src \ NServiceBus.Core \ Transports \ Msmq \ MsmqMessageSender.cs: строка 76 в NServiceBus.Faults.Forwarder.FaultManager.SendFailureMessage (сообщение TransportMessage, исключение e, логическое исключение сериализации) в c: \ BuildAgent \ 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 в NServiceBus.Unicast.Transport.FirstLevelRetries.TryInvokeFaultManager (сообщение TransportMessage, исключение исключения) в c: \ BuildAgent \ work \ d4de8921a0aabf04 \ src \ NServiceBus.Core \ Unicast \ Transport \ FirstLevelRetries.cs: строка 71InnerExceptionNServiceBus.Unicast.Queuin g.QueueNotFoundException: Не удалось отправить сообщение по адресу: [administrator.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) в NServiceBus.Transports.Msmq.MsmqMessageSender.Send (сообщение TransportMessage, адрес адреса) в c: \ BuildAgent \ work \ d4de8921a0aabf04 \ src \ NServiceBus.Core \ Transports \ Msmq \ MsmqMessageSender.cs: строка 60 --- Конец внутренней стеки стека исключений --- в NServiceBus.Transports.Msmq.MsmqMessageSender.Send (сообщение TransportMessage, адрес адреса) в c: \ BuildAgent \ w ork \ d4de8921a0aabf04 \ src \ NServiceBus.Core \ Transports \ Msmq \ MsmqMessageSender.cs: строка 76 в NServiceBus.Faults.Forwarder.FaultManager.SendFailureMessage (сообщение TransportMessage, исключение e, логическое исключение сериализации) в c: \ BuildAgent \ work \ d4de8921a0aabf04 \ src \ NServiceBus.Core \ Faults \ Forwarder \ FaultManager.cs: строка 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) в NServiceBus.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) в NServiceBus.Transports.Msmq.MsmqDequeueStrategy.Action() в C: \ BuildAgent \ работы \ d4de8921a0aabf04 \ SRC \ NServiceBus.Core \ транспорты \ Msmq \ MsmqDequeueStrategy.cs: линия 227 на System.Threading.Tasks.Task.Execute()

FaultManager.log:

2013-10-02 17: 49: 31,5746 | FATAL | 110 | Не удалось отправить сообщение об ошибке в очередь ошибок «administrator.worker @ localhost.Retries @ localhost», поскольку его не удалось найти.

I инициализации 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()); 

EDIT: Более подробную информацию. Я принимаю NSB в IIS. Я публикую, отправляю и обрабатываю сообщения.

Web.config выглядит следующим образом: Web.config

+0

Похоже, что ошибка в конфигурации, поскольку очередь, которую он пытается отправить, явно искажена. Не могли бы вы разместить свой конфиг? –

+0

Я заметил, что после отключения SecondLevelRetries все стало работать. Однако я хочу, чтобы они работали. Также я попытался включить таймауты, и у меня есть аналогичные проблемы. Я получаю сообщение об ошибке 2013-10-03 13: 35: 12.8477 | WARN | 59 | не удалось обработать сообщение. NServiceBus.Unicast.Queuing.QueueNotFoundException: Не удалось отправить сообщение по адресу: [administrator.worker @ localhost.Timeouts @ localhost] ---> System.Messaging.MessageQueueException: очередь не существует или у вас нет достаточных разрешений для выполнения операция. – stachu

ответ

3

проблема в коде Init ...

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

Я не вижу, что на скриншоте вашего Web.config вы предоставили, но на основе ошибок, я предполагаю, у вас есть то, что определено как "[email protected]". Это должно быть только "administration".

Конечная точка и очередь ввода - это не одно и то же. Начиная с вашего имени конечной точки, NServiceBus отображает имена всех очередей оттуда. Таким образом, входная очередь {EndpointName}@localhost. Если вы используете главный узел с подключенным рабочим, очередь ввода рабочего пользователя равна {EndpointName}[email protected]. Очередь тайм-аута - {EndpointName}[email protected] и т. Д.

Конечно, вы обычно не должны определять имя конечной точки в конечной точке NServiceBus.Host, но похоже, что вы являетесь самостоятельным хостингом в веб-приложении.

Подробнее об 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% \ Особенное Software \ NServiceBus \ v4.0 \ NServiceBus \ Samples \ ErrorHandling)

или в Github https://github.com/Particular/NServiceBus/tree/develop/Samples/ErrorHandling

Надежда это помогает

+0

Спасибо за быстрый ответ. Однако я упомянул записи. – stachu