У меня есть работа с двумя шагами, но эти два шага являются секционированными шагами.
Шаги в основном являются Lucene индексирования(первый шаг) и Lucene поиска Шаг (второй шаг), и на данный момент я создавал Lucene reader, Lucene searcher и Lucene writer объектов в шаге Partitioner
и передачи соответствующих компонентов шага с помощью @Value
аннотаций.
Теперь есть изменение требования, и иногда мне нужен объект writer из другого потока ( другого секционированного шага ) в текущем потоке ( текущий секционированный шаг), но Lucene не позволяет создавать несколько объектов writer для одного каталога, поэтому мне нужно поделиться этими объектами через секционированные шаги.
Таким образом, решение состоит в том, чтобы создать уровень заданияMap
, который содержит все эти объекты, и я получаю эти объекты из map всякий раз, когда мне нужно в компоненте шага ( читатель, процессор или писатель), то, наконец, я размещаю/закрываю все эти объекты в конце задания.
Как этого достичь? т. е. Можно ли поместить эти объекты jobExecution.getExecutionContext()
в JobExecutionListenerSupport
beforeJob(JobExecution jobExecution)
метод in?
Как получить конкретные объекты с этой карты в reader, processor & writer? Я бы не знал это во время настройки, но во время выполнения.
Наконец, я закрою эти объекты в JobExecutionListenerSupport
afterJob(JobExecution jobExecution)
методе in.
Я использую аннотацию на основе конфигурации Spring batch и Lucene 6.0.
Пожалуйста предложите.
Предложенный мной подход заключается в том, чтобы поместить эти объекты
ExecutionContext - jobExecution.getExecutionContext()
в методbeforeJob(JobExecution jobExecution)
, а затем закрыть эти ресурсы вafterJob(JobExecution jobExecution)
работе хорошо для меня. Я не вижу никаких проблем.Я просто впрыскиваю —
@Value("#{jobExecutionContext}")
в компонентах где мне нужно оно.