0

「分割フロー」を使用して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。長い質問で申し訳ありません。助けてくれてありがとう。

4

1 に答える 1

0

このシナリオの正しい動作は、どちらの場合も、COMPLETEDJob2 と Job4 が完了するまで Job1 をマークしないことです。いずれかのシナリオでそれが発生しない場合、これはバグであり、Jira ( https://jira.spring.io ) に記録する必要があります。Job1 のフラグが の場合、Spring Batch Admin で他のジョブが完了していませんCOMPLETEか?

于 2014-08-21T14:46:38.107 に答える