1

Job の同じインスタンスを再度開始したくないため、パラメーター restart="false" を使用して Spring-Batch Job を定義しました。

<batch:job id="myJob" restartable="false">
    <batch:step id="myStep">
        <batch:tasklet>
            ...
        </batch:tasklet>
    </batch:step>
</batch:job>

ジョブは、他の 2 つのより高レベルなジョブで参照されます。

<batch:job id="hightLevelJob1" restartable="false">
    <batch:step id="myHighLevelJob1Step1" next="...">
        <batch:job ref="myJob"/>
    </batch:step>
    ...
</batch:job>

<batch:job id="hightLevelJob2" restartable="false">
    <batch:step id="myHighLevelJob2Step1" next="...">
        <batch:job ref="myJob"/>
    </batch:step>
    ...
</batch:job>

これで、それぞれが高レベルのジョブの 1 つを開始する 2 つの JUnit-Tests ができました。

@Autowired
private JobOperator jobOperator;

@Test
public void testHighLevelJob1() throws JobExecutionException {
    final Long executionId = jobOperator.startNextInstance("myHighLevelJob1");
    ...
}

@Test
public void testHighLevelJob2() throws JobExecutionException {
    final Long executionId = jobOperator.startNextInstance("myHighLevelJob2");
    ...
}

最初のテストは正常に実行されますが、2 番目のテストでは JobRestartException がスローされます。

JobInstance already exists and is not restartable

jobOperator.startNextInstance() を使用しているため、新しいジョブが作成されます。ただし、これは開始された高レベルのジョブにのみ適用されるようです。Spring-Batch が参照されたジョブを再利用しようとしているようです。

参照されたジョブの新しいインスタンスも毎回作成されるようにジョブを構成するにはどうすればよいですか?

4

1 に答える 1

1

これが機能するにはJobParametersIncrementerが必要です。startNextInstance の javadoc には次のように明確に記載されています。

JobParametersIncrementer は、JobParameters に新しいパラメーターを増やして配置するのに役立ちます。これにより、ジョブの新しいインスタンスを開始できます。

ジョブ定義 Bean を変更し、インクリメンタを追加します

<batch:job id="myJob" restartable="false" incrementer="incrementer">
    <batch:step id="myStep">
        <batch:tasklet>
            ...
        </batch:tasklet>
    </batch:step>
</batch:job>

そして、自明なインクリメンタを使用して JobParametersIncrementer クラスを実装します

<bean id="incrementer"
        class="com...TrivialJobParametersIncrementer" />

春のバッチ管理サンプルでサンプルのTrivialJobParametersIncrementerを見つけることができます。

于 2012-07-20T06:30:28.263 に答える