Мне нужно создать весенний пакет, в котором мне нужно получить данные из двух разных таблиц. Это будет часть для чтения.
Проблема в том, что мне нужно иметь 2 запроса читателя. И только один из них будет вызван по условию. Но писатель будет тот же. Таким образом, тасклет становится таким же в основном.
Могу ли я иметь 2 считывателя внутри одного шага, который будет вызываться в соответствии с условием..??
Что-то вроде внутри весеннего пакета xml:
if (condition)
then reader1
else reader2
...
....
......
<reader1 id = ".." class = "..">
</reader1>
.....
........
<reader2 id = ".." class = "..">
</reader2>
Рассматривали ли вы возможность использования шаблонов потока условного управления, предлагаемых Spring Batch? Я думаю, что это могло бы привести к более простой конструкции и придерживаться некоторых основных шаблонов, которые поощряет весенняя партия.
Вы в основном программируете «условие», при котором вы хотите, чтобы шаг вызывался. Итак, определите два шага, скажем, step1
, у которого есть считыватель, процессор, писатель для одного типа объекта и step2
, у которого есть считыватель, процессор, писатель для другого типа. Возможно, писатели также являются общими для разных типов. Затем вы можете определить поток управления следующим образом:
@Bean
public Job myJob() {
JobBuilder jobBuilder = jobs.get("Spring Batch: conditional steps");
return jobBuilder.start(determineRoute())
.on("item1").to(flow1())
.on("item2").to(flow2()).end()
.build();
}
В примере determineRoute()
— это тасклет, который возвращает настраиваемые значения ExitStatus item1
или item2
и flow1
, а flow2
— разные потоки (или шаги) для обработки каждого объекта.
См. здесь в их документах: https://docs.spring.io/spring-batch/docs/current/reference/html/step.html#conditionalFlow
Обновлено: вы также можете сделать что-то подобное с помощью JobExecutionDecider
https://www.baeldung.com/spring-batch-conditional-flow#2-programmatic-branching-withjobexecutiondecider
only one of them will be called based on the condition
: На чем основано это состояние? Параметр работы? Системное свойство? Что-то рассчитано на предыдущем шаге? Я не вижу необходимости иметь два считывателя в вашем случае, это вопрос конфигурации ИМО.