Почему nservicebus игнорирует мое сообщение о подписке?

#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. Ну, локально сообщения о подписке удаляются из очереди ввода и помещаются в очередь подписки… На тестовом сервере они просто находятся в очереди ввода.