「分割フロー」を使用してSpringバッチジョブを並行して実行すると、Springバッチ管理とコマンドラインに違いがあることがわかりました。
次のようなジョブフローがあります。
Job1 -> Job2 -> Job3
-> Job4
Spring バッチ管理からこれらのジョブを実行すると、「Job1」は「Job2」と「Job4」の両方を起動でき、次に「Job2」は「Job3」を起動できます。
また、「step1」が終了すると、「Job1」が終了します。そして、「Job2」と「Job4」が並行して処理を続けます。
「Job1」は、「Job2」と「Job4」が完了するのを待ちません。
app-context.xml と Spring バッチ管理のジョブ構成は次のとおりです。
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>
app-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>
ただし、コマンド ラインでは、Spring バッチ管理とはいくつかの違いがあります。
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>
app-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' を起動できます。
問題は
'step1' は終了しましたが、'Job1' のステータスはまだ 'Unknown' です。「Job2」と「Job4」が終了して初めて、ステータスが「Completed」に変わります。
「Job1」は「Job2」と「Job4」が完了するのを待っています。
しかし、Spring バッチ管理では、「Job1」は「Job2」と「Job4」を待ちません。「ジョブ 1」のステータスは、「ステップ 1」が完了するとすぐに「完了」に変わります。
コマンドラインで「Job1」が「Job2」と「Job4」を待つのは望ましくありません。
そうする方法はありますか?
Ps。長い質問で申し訳ありません。助けてくれてありがとう。