Используйте Spring Batch для записи в разные источники данных
Для проекта мне нужно обработать элементы из одной таблицы и сгенерировать 3 разных элемента для 3 разных таблиц, причем все 3 во втором источнике данных отличаются от первого элемента. Реализация осуществляется с помощью Spring Batch поверх Oracle DB. Я думаю, что в этом вопросе есть что-то похожее на то, что мне нужно, но там он в конце пишет только один другой пункт.
Чтобы проиллюстрировать ситуацию:
DataSource 1 DataSource 2
------------ ------------------------------
Table A Table B Table C Table D
Читатель должен прочитать один элемент из таблицы A. В процессоре, используя информацию из элемента в A, будут созданы 3 новых элемента типа B, C и D. Кроме того, элемент из таблицы A будет обновлен.
Писатель должен уметь писать одновременно все 4 предмета. Моя первая реализация использует JpaItemWriter для обновления элемента A, но я не знаю, как процессор мог передать записывающему устройству остальные 3 элемента, чтобы сохранить все одновременно.
Может ли процессор вернуть несколько элементов разных типов? Нужно ли мне создать 4 шага, каждый из которых пишет один из предметов? И в этом случае, будет ли это безопасно (если при записи D будет ошибка, то A, B и C будут иметь откат)?
Заранее спасибо за вашу поддержку!
1 ответ
Ваш вопрос действительно два вопроса. Давайте посмотрим на каждого в отдельности:
Может ItemProcessor
вернуть несколько предметов
ItemProcessor может возвращать только один элемент за каждый переданный элемент. В связи с этим в вашем конкретном сценарии вам понадобится ItemProcessor
вернуть объект-обертку, который оборачивает элементы A, B, C и D.
Как я могу написать разные типы в одном шаге
Spring Batch сильно зависит от композиции в своей модели программирования. Так как ваш ItemProcessor
будет возвращать объект-обертку ItemWriter
это разворачивает элементы A, B, C и D и передает запись каждого из них соответствующему автору. Таким образом, в конечном решении вы получите 5 ItemWriter
s: один для каждого типа элемента и один, который охватывает все из них. Взгляните на наши CompositeItemWriter
Например, здесь: https://github.com/spring-projects/spring-batch/blob/master/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/support/CompositeItemWriter.java