| Предыдущий | Следующий |
| 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 того же сообщения.
Как подтвердить исправление
Повторяйте исходный сценарий с новым корректно открытым объектом и отдельно проверяйте конкурентный путь. Простое исчезновение ошибки после перезапуска службы не доказывает устранение гонки или ошибки времени жизни.
Технические ссылки
Нужно найти другой код? Найти другой код состояния или ошибки.
