как обрабатывать сообщения после разделения (даже если будут ошибки) в Spring Integration?

У меня есть приложение на базе Spring Integration. вкратце схема такая:

                                             |-> activator
gateWay -> splitter -> transformer -> router |-> ...
                                             |-> activator

Например, служба получает некоторый массив json, разбивает его на объекты json, а затем преобразует их в какой-либо объект java. При преобразовании он может вызвать некоторые ошибки проверки.

Справочник по интеграции Spring говорит:

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

Поэтому я ожидаю, что если я отправлю массив json с одним недопустимым объектом, который выдает ошибку проверки, все остальные сообщения будут обрабатываться нормально, и только один недопустимый объект будет отправлен в канал ошибки. Но это не так. Когда возникает первое исключение проверки, все остальные сообщения не обрабатываются.

например: ["correct", "correct", "invalid"] --> 2 сообщения будут обработаны, все в порядке. ["invalid", "correct", "correct"] --> 0 сообщения будут обработаны.

Итак, как обрабатывать сообщения после разделения, даже если будут ошибки?

Спасибо


person m.gavr    schedule 26.02.2018    source источник


Ответы (1)


Что ж, на самом деле splitter компонент не несет ответственности за обработку ошибок нисходящего потока. Это смесь ответственности, которая не подходит для модели EIP.

То же самое происходит, когда у вас есть чистый цикл Java. Верно, вы можете использовать там try...catch внутри цикла, но это выглядит некрасиво с точки зрения дизайна. Итак, вы решили вынести логику обработки в отдельный метод и использовать там этот try...catch. Вы только что разделили ответственность.

То же самое мы можем сделать, фактически, мы разветвитель и его нижестоящий подписчик для элемента вывода. это может быть достигнуто с помощью ExpressionEvaluatingRequestHandlerAdvice и его опций onFailureExpression, failureChannel и trapException = true.

Этот совет вы должны использовать для своего определения transformer.

Дополнительную информацию см. в Справочное руководство. Также есть некоторые подсказки в Sample приложение.

person Artem Bilan    schedule 26.02.2018
comment
Хорошо, я вижу, спасибо. Меня ввело в заблуждение описание в документации разделить это сообщение на несколько сообщений, а затем отправить каждое из них в свой выходной канал. так что я понял, что у каждого разделенного сообщения есть собственный жизненный цикл. - person m.gavr; 27.02.2018
comment
Что ж, предполагается поведение Java по умолчанию. Если это отличается или имеет особое значение, мы объясним это. - person Artem Bilan; 27.02.2018