У меня есть шаг с читателем, процессором и писателем для записи данных в файлы.
В зависимости от типа обрабатываемых данных я хочу записать его в другое место.
Как я могу указать во время выполнения от читателя или процессора, где должны быть записаны данные?
Пример (может быть, глупый):
read (items) → process (items)> write (to apple folder)
read (items) → process (items)> write (tomato folder)
Я не могу знать, в каком порядке идут предметы, а также их тип. Я только нахожу это в читателе и процессоре, но писатель снова не знает, что он обрабатывает.
Есть ли способ сделать это (что-то вроде reader.getWriter(). SetAttribute() или с помощью какого-то сеанса)?
Композиция - сильная тема весенней партии. В этом случае вам понадобится реализовать составной ItemWriter
который делегирует дочерний ItemWriter
на основе того, где он должен быть написан. У вас есть два варианта: реализовать свои собственные или использовать ClassifierCompositeItemWriter
предоставленные Spring Batch. Это будет действительно зависеть от того, что логика для вашего процесса выбора. Подробнее о ClassifierCompositeItemWriter
вы можете прочитать здесь: http://docs.spring.io/spring-batch/trunk/apidocs/org/springframework/batch/item/support/ClassifierCompositeItemWriter.html
При использовании этого подхода важно отметить, что делегат ItemWriter
не будет автоматически зарегистрирован как ItemStream
s. Вам нужно будет сделать это вручную. Вы можете прочитать о том, как это сделать здесь: http://docs.spring.io/spring-batch/trunk/reference/htmlsingle/#delegatePatternAndRegistering
FlatFileItemWriter
реализует ResourceAwareItemWriterItemStream
который позволит вам реализовать обертку ItemWriter
для установки ресурса на основе входных данных. Однако есть пара предостережений. Во-первых, он может быть установлен только один раз для каждого чанка, поэтому вам необходимо установить соответствующий размер чанка (потенциально 1). Другое предостережение заключается в том, что при открытии / закрытии файлов для записи вы сильно пострадаете.