Отмена обработки с сохранением причины¶
Сценарий. Сообщение невалидно (нет обязательного поля, неизвестный формат) — нужно отменить обработку и сохранить причину отказа для последующего разбора.
Код обработчика¶
Процедура Десериализация(ТелоСообщения, Свойства, ТекстЖурнала, Отказ) Экспорт
Данные = ОбщегоНазначения.JSONВЗначение(ТелоСообщения, "", Ложь);
Если Не ЗначениеЗаполнено(Данные.ref) Тогда
ТекстЖурнала = СтрШаблон(
"Отсутствует поле 'ref'. Топик: %1, смещение: %2",
Свойства.Топик,
Свойства.Смещение
);
Отказ = Истина;
Возврат;
КонецЕсли;
// ... основная обработка ...
КонецПроцедуры
Что происходит при Отказ = Истина¶
- Сообщение получает статус «Ошибка обработки» в РС «Входящие сообщения».
- Текст из
ТекстЖурналасохраняется в записи и доступен в поле Текст журнала. - Автоматический повтор не запускается — администратор разбирает ошибку вручную.
- После устранения причины — кнопка Вернуть в очередь в РС «Входящие сообщения».
Идемпотентность¶
Повторный вызов
Обработчик может быть вызван повторно при перезапуске или ручном возврате. Проектируйте его так, чтобы повторный вызов с тем же сообщением не создавал дубликаты и не вызывал побочных эффектов.
Проверки на валидность (как в примере выше) идемпотентны по определению — одно и то же сообщение даёт один и тот же результат.
Разные причины отказа — разные обработки¶
Процедура Десериализация(ТелоСообщения, Свойства, ТекстЖурнала, Отказ) Экспорт
Попытка
Данные = ОбщегоНазначения.JSONВЗначение(ТелоСообщения, "", Ложь);
Исключение
ТекстЖурнала = "Некорректный JSON: " + ОписаниеОшибки();
Отказ = Истина;
Возврат;
КонецПопытки;
Если Не ЗначениеЗаполнено(Данные.ref) Тогда
ТекстЖурнала = "Отсутствует поле 'ref'";
Отказ = Истина;
Возврат;
КонецЕсли;
Если Не Данные.Свойство("version") Или Данные.version > МаксимальнаяВерсия() Тогда
ТекстЖурнала = СтрШаблон("Неподдерживаемая версия контракта: %1", Данные.version);
Отказ = Истина;
Возврат;
КонецЕсли;
// ... основная обработка ...
КонецПроцедуры