Перейти к содержанию

Отмена обработки с сохранением причины

Сценарий. Сообщение невалидно (нет обязательного поля, неизвестный формат) — нужно отменить обработку и сохранить причину отказа для последующего разбора.

Код обработчика

Процедура Десериализация(ТелоСообщения, Свойства, ТекстЖурнала, Отказ) Экспорт

    Данные = ОбщегоНазначения.JSONВЗначение(ТелоСообщения, "", Ложь);

    Если Не ЗначениеЗаполнено(Данные.ref) Тогда
        ТекстЖурнала = СтрШаблон(
            "Отсутствует поле 'ref'. Топик: %1, смещение: %2",
            Свойства.Топик,
            Свойства.Смещение
        );
        Отказ = Истина;
        Возврат;
    КонецЕсли;

    // ... основная обработка ...

КонецПроцедуры

Что происходит при Отказ = Истина

  • Сообщение получает статус «Ошибка обработки» в РС «Входящие сообщения».
  • Текст из ТекстЖурнала сохраняется в записи и доступен в поле Текст журнала.
  • Автоматический повтор не запускается — администратор разбирает ошибку вручную.
  • После устранения причины — кнопка Вернуть в очередь в РС «Входящие сообщения».

Идемпотентность

Повторный вызов

Обработчик может быть вызван повторно при перезапуске или ручном возврате. Проектируйте его так, чтобы повторный вызов с тем же сообщением не создавал дубликаты и не вызывал побочных эффектов.

Проверки на валидность (как в примере выше) идемпотентны по определению — одно и то же сообщение даёт один и тот же результат.

Разные причины отказа — разные обработки

Процедура Десериализация(ТелоСообщения, Свойства, ТекстЖурнала, Отказ) Экспорт

    Попытка
        Данные = ОбщегоНазначения.JSONВЗначение(ТелоСообщения, "", Ложь);
    Исключение
        ТекстЖурнала = "Некорректный JSON: " + ОписаниеОшибки();
        Отказ = Истина;
        Возврат;
    КонецПопытки;

    Если Не ЗначениеЗаполнено(Данные.ref) Тогда
        ТекстЖурнала = "Отсутствует поле 'ref'";
        Отказ = Истина;
        Возврат;
    КонецЕсли;

    Если Не Данные.Свойство("version") Или Данные.version > МаксимальнаяВерсия() Тогда
        ТекстЖурнала = СтрШаблон("Неподдерживаемая версия контракта: %1", Данные.version);
        Отказ = Истина;
        Возврат;
    КонецЕсли;

    // ... основная обработка ...

КонецПроцедуры

Смотрите также