#c# #msmq #nservicebus #windows-server-2008-r2
#c# #msmq #nservicebus #windows-server-2008-r2
Вопрос:
У меня есть два простых консольных приложения для интеграции nservicebus. Один из них — издатель, другой — подписчик. Подписчик в этом случае также получает другие сообщения через Send()
другое веб-приложение. Когда я запускаю их локально в своей среде разработки, проблем нет, все работает так, как ожидалось. Я могу отправлять сообщения из веб-приложения и получать их на моем «подписчике», а также получать опубликованное сообщение на моем подписчике.
Однако при развертывании на Server 2008 R2 подписчик отправляет первоначальное сообщение издателю StatusQueue с этим содержимым:
<?xml version="1.0"?>
<Messages xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.net/NServiceBus.Unicast.Transport">
<CompletionMessage>
<ErrorCode>0</ErrorCode>
</CompletionMessage>
</Messages>
Я думаю, что это всего лишь начальное «Я хочу подписаться на сообщения, которые вы публикуете, типа Messages . *». Это сообщение просто находится в очереди и никогда не принимается издателем.
Конфигурация издателя:
<MsmqSubscriptionStorageConfig
Queue="StatusQueueSubscriptions" />
<MsmqTransportConfig
InputQueue="StatusQueue"
ErrorQueue="StatusError"
NumberOfWorkerThreads="1"
MaxRetries="5"/>
Конфигурация подписчика:
<MsmqTransportConfig
InputQueue="AppsInputQueue"
ErrorQueue="AppsError"
NumberOfWorkerThreads="1"
MaxRetries="5"/>
<UnicastBusConfig>
<MessageEndpointMappings>
<add Messages="Messages" Endpoint="StatusQueue"/>
</MessageEndpointMappings>
</UnicastBusConfig>
Ответ №1:
Вероятная причина, по которой ваша подписка игнорируется, заключается в том, что входящее сообщение издателю не соответствует типу, определенному в вашей подписке.
Поэтому, когда издатель получает сообщение, он оценивает его по имеющимся в нем подпискам и не находит совпадения, поэтому вашему подписчику не будет отправлено сообщение.
Это может быть связано с тем, что тип сообщения в NServiceBus определяется не только именем сборки / типа, но и версией сборки и токеном открытого ключа.
Проверьте версии / токены PK сборок сообщений, хранящихся у издателя и подписчика, и убедитесь, что они полностью совпадают.
Обновить
ХОРОШО, похоже, что разрешения в вашей очереди ввода каким-то образом не позволяют вашей учетной записи службы publisher читать сообщения. Попробуйте предоставить полный контроль учетной записи службы.
Кроме того, вы проверили местоположение регистрации по умолчанию на наличие ошибок в журнале? (C:Users (имя пользователя)AppDataLocalTemp)
Комментарии:
1. Но издатель даже не извлекает сообщение из очереди и не переводит его в error или что-то в этом роде. Он просто сидит там.
2. Вы используете MSMQ в качестве хранилища подписки или SQL server?
3. Поэтому, когда вы используете MSMQ, сообщения о подписке не удаляются из очереди. Они хранятся там. Если вы использовали SQL server, подписки перемещаются в базу данных и удаляются из очереди.
4. Ну, локально сообщения о подписке удаляются из очереди ввода и помещаются в очередь подписки… На тестовом сервере они просто находятся в очереди ввода.