Сообщения MSMQ застревают в исходящей очереди

Хотя мой вопрос похож на какой-то уже найденный на SO, этот пост мне не помог, так вот он:

Дано:

  • Две машины в одном сегменте (естественно, в том же домене, фактически на одном столе)
  • Обе машины - это рабочие станции Windows 7.
  • Обе машины отключили брандмауэр
  • Обе машины видят друг друга (ping works)
  • В одной из них есть очередь частных транзакций без транзакций test.
  • Отправитель-машина имеет HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSMQ\SimpleClient\@BinaryEnabled = 'Yes'
  • Владелец очереди отправляет сообщение с другого компьютера
  • Сообщение застряло в исходящей очереди, никогда не доходя до цели.
  • При отправке с одного и того же компьютера (то есть локально) сообщение приходит OK.

Сообщение отправляется с использованием следующего кода:

var q = new MessageQueue(@"FormatName:Direct=OS:il-mark-lap\private$\test");
q.Send(string.Format("Test message sent at {0} from {1}", DateTime.Now, Environment.MachineName));

Где il-mark-lap - адрес машины с очередью.

Что мне нужно сделать, чтобы заставить эту работу работать?

Большое спасибо.

Ответы

Ответ 1

Я думаю, что нашел ответ на этот вопрос, у меня возникла проблема, которая, похоже, была той же проблемой, моя только застряла после того, как не отправила сообщение клиенту в течение 10 минут. Взгляните на эту статью в KB, она может вам помочь. Кроме того, в моем случае это не имело никакого отношения к перезапуску, поэтому не позволяйте этому отбросить вас, я обнаружил симптомы в netstat, и сообщения сначала пройдут, когда клиент будет запущен.

http://support.microsoft.com/kb/2554746

Ответ 2

У меня была эта проблема сегодня. Чтобы устранить это, нам пришлось открыть диалоговое окно свойств очереди сообщений на принимающем сервере, а на вкладке "Безопасность сервера" снимите флажок "Отключить вызовы RPC без аутентификации". Кроме того, в частной очереди Properties | На вкладке "Безопасность" мы изменили безопасность, чтобы предоставить "Полный контроль". В моем случае машины находятся в одном сегменте, но не в одном домене. Очередь не является транзакционной. Мы используем IP-адреса для привязок к конечным точкам (WCF), NetBIOS/DNS не находится в игре.

Ответ 3

Я только что рассмотрел проблему, вот шаги, которые я предпринял для ее устранения:

Получите утилиту DTCPing от Microsoft, запустите ее на компьютерах, использующих MSMQ, коды DTC должны иметь возможность разговаривать друг с другом в для работы MSMQ.

Устранение проблем MSDTC с помощью инструмента DTCPing

Это, в свою очередь, помогло мне понять, что MSMQ сильно зависит от имен NetBIOS - машины должны иметь возможность пинговать друг друга, используя только имена NetBIOS.

Как только это будет сделано, убедитесь, что вы перезагрузили ВСЕ службы очереди сообщений (как на отправляющей машине, так и на конечной машине, поскольку она должна иметь возможность выполнять обратную операцию NetBIOS).

В моем случае, как только я получил код DTC с разрешением имен NetBIOS - перезапустил службы - все начало работать магически.

Я настоятельно рекомендую вам посетить эту страницу для дополнительных ресурсов.

Ответ 4

У меня была проблема, когда у нас было 2 сервера, отправляющих сообщения третьим. Получалось только одно сообщение сервера. Сообщения от другого были застреваны в исходящей очереди как "неподтвержденные".

Проблема заключалась в том, что все компьютеры были клонированы VM и имели тот же QMId в разделе реестра: HKLM\Software\Microsoft\MSMQ\Parameters\Machine Cache. Мы переустановили MSMQ на серверы, которые исправили проблему.

Литература:

http://baleinoid.com/whaly/2012/08/random-bug-msmq-unacknowledged-messages/ http://blogs.msdn.com/b/johnbreakwell/archive/2007/02/06/msmq-prefers-to-be-unique.aspx

Ответ 5

Обычно частные очереди в локальной сети могут отправлять сообщения друг другу. Но иногда частная очередь может быть недоступна и заставляет других создавать исходящие очереди... Не знаю почему.

Ответ 6

Ответ прост. Убедитесь, что вы можете использовать telnet-порты 1801,135,2103 и 2105 как от исходного устройства к месту назначения, так и наоборот. Также убедитесь, что MSMQ работает на обеих машинах.