Несколько ItemProcessors и ItemWriters на одном шаге Spring Batch
Могу ли я написать шаг Spring Batch с одним ItemReader и несколькими подшагами, каждый с ItemProcessor , за которым следует ItemWriter?
Я пытаюсь добиться чего-то вроде этого:
ItemReader ---> item ---> ItemProcessor#1 ---> ItemProcessor#2
| |
v v
ItemWriter#1 ItemWriter#2
Дополнительные примечания
- Чтобы избежать несоответствий, я бы предпочел не читать пункты дважды.
- Секунда
ItemProcessor
нужно будет отфильтровать некоторые пункты, которые должны быть написаны первымиItemWriter
, но не вторым.
Я считаю, что этот вопрос отличается от вопроса Spring Batch: один считыватель, несколько процессоров и записывающих устройств, потому что мне нужно будет обрабатывать элементы последовательно, а не параллельно.
1 ответ
Модель обработки, ориентированная на фрагменты, предоставляемая Spring Batch, основана на двух ключевых концепциях:
- : предоставляет фрагменты данных путем делегирования
ItemReader
- : обрабатывает блок данных, делегируя
ItemProcessor
а такжеItemWriter
По умолчанию Spring Batch предоставляет две реализации каждого интерфейса:
SimpleChunkProvider
/
FaultTolerantChunkProvider
а также
SimpleChunkProcessor
/
FaultTolerantChunkProcessor
(Spring Batch предоставляет другие реализации для удаленного разделения/разбиения на фрагменты, но здесь это выходит за рамки). «Простая» версия используется по умолчанию для каждого компонента. Если поведение по умолчанию недостаточно или не может быть настроено в соответствии с вашими потребностями, вы можете предоставить свои пользовательские компоненты. Пожалуйста, взгляните на этот вопрос из часто задаваемых вопросов: какова философия Spring Batch в отношении использования гибких стратегий и реализаций по умолчанию?Вот отрывок:
We expect clients to create their own more specific strategies that can be
plugged in to control things like commit intervals (CompletionPolicy),
rules about how to deal with exceptions (ExceptionHandler), and many others.
Итак, чтобы ответить на ваш вопрос, вы можете предоставить пользовательскую реализацию
ChunkProcessor
который вызывает несколько процессоров/писателей в конвейере, как вы хотите. При таком подходе вы будете читать элементы только один раз, так как вы можете продолжать использовать значение по умолчанию.
ChunkProvider
.