Передать параметры из процессора в Writer

1

У меня есть шаг с читателем, процессором и писателем для записи данных в файлы.

В зависимости от типа обрабатываемых данных я хочу записать его в другое место.

Как я могу указать во время выполнения от читателя или процессора, где должны быть записаны данные?

Пример (может быть, глупый):

read (items) → process (items)> write (to apple folder)

read (items) → process (items)> write (tomato folder)

Я не могу знать, в каком порядке идут предметы, а также их тип. Я только нахожу это в читателе и процессоре, но писатель снова не знает, что он обрабатывает.

Есть ли способ сделать это (что-то вроде reader.getWriter(). SetAttribute() или с помощью какого-то сеанса)?

  • 0
    Хорошо, мы должны предполагать, что все те же самые элементы в данном интервале фиксации должны быть записаны в том же каталоге? Или каждый элемент в одном и том же коммите может быть записан в другой каталог один за другим?
  • 0
    @ArnaudPotier Предполагается, что все элементы в интервале фиксации принадлежат одному каталогу. Это на 100% точно.
Показать ещё 1 комментарий
Теги:
spring-batch

1 ответ

0

Композиция - сильная тема весенней партии. В этом случае вам понадобится реализовать составной 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

  • 0
    К сожалению, то, что вы предлагаете, почти невозможно. Позвольте мне предложить более подробную информацию. Читатель на самом деле сканер - он ищет каждую папку с жесткого диска и читает файлы внутри. Процессор анализирует информацию и затем передает записывающему устройству необходимые данные для продолжения. Автор должен поместить все в исходную папку (из которой работа читается в первую очередь). Дело в том, что у меня много папок, и я не могу сделать писатель для каждой. Надеюсь, вы понимаете мою потребность сейчас. Извините за то, что не предоставил достаточно деталей в первую очередь. Спасибо!
  • 0
    Это не меняет моего ответа. FlatFileItemWriter реализует ResourceAwareItemWriterItemStream который позволит вам реализовать обертку ItemWriter для установки ресурса на основе входных данных. Однако есть пара предостережений. Во-первых, он может быть установлен только один раз для каждого чанка, поэтому вам необходимо установить соответствующий размер чанка (потенциально 1). Другое предостережение заключается в том, что при открытии / закрытии файлов для записи вы сильно пострадаете.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню