Spring Batch: разница между администратором Spring Batch и командной строкой, когда задания выполняются параллельно
Когда я параллельно выполнял пакетные задания пружины, используя "разделенный поток", я обнаружил, что между администратором пружинного пакета и командной строкой есть различия.
У меня есть поток работ следующим образом:
Job1 -> Job2 -> Job3
-> Job4
Когда я запускаю эти задания из весеннего пакетного администратора, "Job1" может запускать "Job2" и "Job4", а затем "Job2" может запускать "Job3".
Более того, "Задание 1" завершается после завершения "шага 1". И затем "Job2" и "Job4" продолжают свои процессы параллельно.
"Job1" не ожидает завершения "Job2" и "Job4".
app-context.xml и конфигурация задания для админки Spring Batch выглядят следующим образом:
Job1.xml
<import resource="classpath*:META-INF/spring/batch/dependencies/parallel2.xml"/>
<import resource="classpath*:META-INF/spring/batch/dependencies/parallel3.xml"/>
<bean id="taskExecutor" class="org.springframework.core.task.SimpleAsyncTaskExecutor"/>
<bean id="simpleJobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
<property name="jobRepository" ref="jobRepository" />
<property name="taskExecutor" ref="taskExecutor" />
</bean>
<bean id="job1.stp01" class="com.jobs.Job1Step1" />
<batch:job id="Job1" restartable="true" >
<batch:step id="step1" next="split">
<batch:tasklet ref="job1.stp01" />
</batch:step>
<batch:split id="split" next="step3">
<batch:flow>
<batch:step id="flow1" >
<batch:job ref="Job2" job-launcher="simpleJobLauncher"/>
</batch:step>
</batch:flow>
<batch:flow>
<batch:step id="flow2">
<batch:job ref="Job3" job-launcher="simpleJobLauncher"/>
</batch:step>
</batch:flow>
</batch:split>
</batch:job>
приложение-context.xml
<batch:job-repository id="jobRepository" />
<task:executor id="jobLauncherTaskExecutor" pool-size="10" rejection-policy="ABORT"/>
<bean id="jobRegistry" class="org.springframework.batch.core.configuration.support.MapJobRegistry" />
<bean class="org.springframework.batch.core.configuration.support.JobRegistryBeanPostProcessor">
<property name="jobRegistry" ref="jobRegistry"/>
</bean>
Но в командной строке есть некоторые отличия от админки batch.
app-context.xml и конфигурация задания для командной строки:
Job1.xml
<import resource="app-context.xml" />
<import resource="parallel2.xml"/>
<import resource="parallel3.xml"/>
<bean id="job1.stp01" class="com.jobs.Job1Step1" />
<batch:job id="Job1" restartable="true" >
<batch:step id="step1" next="split">
<batch:tasklet ref="job1.stp01" />
</batch:step>
<batch:split id="split" task-executor="jobLauncherTaskExecutor" next="step3">
<batch:flow>
<batch:step id="flow1" >
<batch:job ref="Job2" job-launcher="simpleJobLauncher"/>
</batch:step>
</batch:flow>
<batch:flow>
<batch:step id="flow2">
<batch:job ref="Job3" job-launcher="simpleJobLauncher"/>
</batch:step>
</batch:flow>
</batch:split>
</batch:job>
приложение-context.xml
<bean id="springBatchDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
.......
</bean>
<bean id="transactionManager" class="org.springframework.batch.support.transaction.ResourcelessTransactionManager" />
<bean id="jobRepository" class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean">
<property name="databaseType" value="POSTGRES" />
<property name="dataSource" ref="springBatchDataSource" />
<property name="transactionManager" ref="transactionManager" />
</bean>
<bean id="simpleJobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
<property name="jobRepository" ref="jobRepository" />
</bean>
<bean id="jobLauncherTaskExecutor" class="org.springframework.core.task.SimpleAsyncTaskExecutor" />
Когда я запускаю задания из командной строки, "Job1" может запускать "Job2" и "Job4", а затем "Job2" может запускать "Job3".
Проблема в
Хотя "шаг1" завершен, статус "Задание1" по-прежнему остается "Неизвестным". Статус изменяется на "Завершено" только после того, как "Job2" и "Job4" завершены.
"Job1" ожидает завершения "Job2" и "Job4".
Но в весеннем пакетном администрировании "Job1" не ожидает "Job2" и "Job4". Статус "Задание1" меняется на "Завершено", как только "шаг1" завершен.
Я не хотел бы, чтобы "Job1" ждал "Job2" и "Job4" в командной строке.
Есть ли способ сделать это???
Ps. Я извиняюсь за долгий вопрос и спасибо за помощь.
1 ответ
Правильное поведение для этого сценария заключается в том, что в обоих случаях Job1 не следует помечать как COMPLETED
пока Job2 и Job4 не будут завершены. Если этого не происходит ни в одном из сценариев, это ошибка и должна быть зарегистрирована в Jira ( https://jira.spring.io/). Вы уверены, что другие задания не завершены в Spring Batch Admin, когда Job1 помечен как COMPLETE
?