Несколько 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.

Другие вопросы по тегам