Что означает код HRESULT 0xC00E001D (MQ_ERROR_MESSAGE_ALREADY_RECEIVED)?

 
Предыдущий Следующий
MQ_ERROR_ILLEGAL_CURSOR_ACTION MQ_ERROR_ILLEGAL_FORMATNAME

MQ_ERROR_MESSAGE_ALREADY_RECEIVED

Что означает MQ_ERROR_MESSAGE_ALREADY_RECEIVED

MQ_ERROR_MESSAGE_ALREADY_RECEIVED (0xC00E001D) — Сообщение, на которое указывает курсор, уже удалено из очереди другим процессом либо другим вызовом MQReceiveMessage, не использовавшим этот курсор.

Получение сообщения в MSMQ изменяет состояние самой очереди: destructive receive удаляет сообщение, а транзакционный receive связывает его судьбу с commit/abort. Поэтому конкурирующие потребители, курсоры и повторные вызовы могут наблюдать уже другое состояние, даже если используют тот же lookup id или позицию.

Что проверить

  • Логируйте cursor/lookup id и consumer, который первым выполнил destructive receive.
  • Проверьте параллельный MQReceiveMessage без этого cursor: он мог удалить сообщение и оставить позицию cursor указывать на уже исчезнувший объект.
  • Исправление должно определять политику гонки consumers, а не просто бесконечно повторять receive того же сообщения.

Как подтвердить исправление

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

Технические ссылки


Нужно найти другой код? Найти другой код состояния или ошибки.