gpt4 book ai didi

java - 重新启动不可重新启动的作业的新实例

转载 作者:太空宇宙 更新时间:2023-11-04 08:09:03 24 4
gpt4 key购买 nike

我定义了一个带有参数 restart="false"的 Spring-Batch 作业,因为我不希望再次启动该作业的同一实例。

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

该作业在另外两个更高级别的作业中被引用:

<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>

我现在有两个 JUnit 测试,每个测试启动一项高级作业:

@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");
...
}

第一个测试运行良好,而第二个测试则抛出 JobRestartException:

JobInstance already exists and is not restartable

我正在使用 jobOperator.startNextInstance(),因此它会创建一个作业。然而,这似乎只适用于已开始的高级工作。看起来 Spring-Batch 尝试重用引用的作业。

如何将作业配置为每次都创建引用作业的新实例?

最佳答案

您需要一个JobParametersIncrementer为此,startNextInstance 的 javadoc 明确指出:“启动由附加到指定作业的 JobParametersIncrementer 确定的 JobInstance 序列中的下一个”

JobParametersIncrementer 可以帮助您增加 JobParameters 并将新参数放入其中,这样就可以启动一个新的 Job 实例。

修改作业定义 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在 Spring 批处理管理示例中。

关于java - 重新启动不可重新启动的作业的新实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11559285/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com