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?

Другие вопросы по тегам