Site icon EfmSoft

Что означает код 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 того же сообщения.

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

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

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


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

Exit mobile version