配置 重启Step

在 “Configuring and Running a Job” 部分 中,讨论了重新启动 。重新启动对步骤有许多影响,因此可能会 需要一些特定的配置。Jobspring-doc.cn

设置起始限制

在许多情况下,您可能希望控制一次 启动。例如,您可能需要配置一个特定 只运行一次,因为它会使某些资源失效,而这些资源必须先手动修复才能修复 再次运行。这可以在步骤级别上进行配置,因为不同的步骤可能具有 不同的要求。只能执行一次的 A 可以作为 与可以无限运行的 a 相同。StepStepStepJobStepspring-doc.cn

以下代码片段显示了 Java 中的启动限制配置示例:spring-doc.cn

Java 配置
@Bean
public Step step1(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
	return new StepBuilder("step1", jobRepository)
				.<String, String>chunk(10, transactionManager)
				.reader(itemReader())
				.writer(itemWriter())
				.startLimit(1)
				.build();
}

以下代码片段显示了 XML 中的启动限制配置示例:spring-doc.cn

XML 配置
<step id="step1">
    <tasklet start-limit="1">
        <chunk reader="itemReader" writer="itemWriter" commit-interval="10"/>
    </tasklet>
</step>

前面示例中显示的步骤只能运行一次。尝试再次运行 导致 a 被抛出。请注意, start-limit 为 。StartLimitExceededExceptionInteger.MAX_VALUEspring-doc.cn

重新启动已完成的Step

对于可重启的作业,可能有一个或多个步骤应始终为 运行,无论他们第一次是否成功。例如,可能 是一个验证步骤或在处理之前清理资源。在 正常处理重新启动的作业,任何状态为 (意味着它 已成功完成),将被跳过。设置为 将覆盖此 URL,以便步骤始终运行。StepCOMPLETEDallow-start-if-completetruespring-doc.cn

以下代码片段显示了如何在 Java 中定义可重启作业:spring-doc.cn

Java 配置
@Bean
public Step step1(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
	return new StepBuilder("step1", jobRepository)
				.<String, String>chunk(10, transactionManager)
				.reader(itemReader())
				.writer(itemWriter())
				.allowStartIfComplete(true)
				.build();
}

以下代码片段显示了如何在 XML 中定义可重启的作业:spring-doc.cn

XML 配置
<step id="step1">
    <tasklet allow-start-if-complete="true">
        <chunk reader="itemReader" writer="itemWriter" commit-interval="10"/>
    </tasklet>
</step>

Step重启配置示例

以下 Java 示例演示如何将作业配置为具有可以 重新 启动:spring-doc.cn

Java 配置
@Bean
public Job footballJob(JobRepository jobRepository, Step playerLoad, Step gameLoad, Step playerSummarization) {
	return new JobBuilder("footballJob", jobRepository)
				.start(playerLoad)
				.next(gameLoad)
				.next(playerSummarization)
				.build();
}

@Bean
public Step playerLoad(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
	return new StepBuilder("playerLoad", jobRepository)
			.<String, String>chunk(10, transactionManager)
			.reader(playerFileItemReader())
			.writer(playerWriter())
			.build();
}

@Bean
public Step gameLoad(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
	return new StepBuilder("gameLoad", jobRepository)
			.allowStartIfComplete(true)
			.<String, String>chunk(10, transactionManager)
			.reader(gameFileItemReader())
			.writer(gameWriter())
			.build();
}

@Bean
public Step playerSummarization(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
	return new StepBuilder("playerSummarization", jobRepository)
			.startLimit(2)
			.<String, String>chunk(10, transactionManager)
			.reader(playerSummarizationSource())
			.writer(summaryWriter())
			.build();
}

以下 XML 示例演示如何将作业配置为具有可以 重新 启动:spring-doc.cn

XML 配置
<job id="footballJob" restartable="true">
    <step id="playerload" next="gameLoad">
        <tasklet>
            <chunk reader="playerFileItemReader" writer="playerWriter"
                   commit-interval="10" />
        </tasklet>
    </step>
    <step id="gameLoad" next="playerSummarization">
        <tasklet allow-start-if-complete="true">
            <chunk reader="gameFileItemReader" writer="gameWriter"
                   commit-interval="10"/>
        </tasklet>
    </step>
    <step id="playerSummarization">
        <tasklet start-limit="2">
            <chunk reader="playerSummarizationSource" writer="summaryWriter"
                   commit-interval="10"/>
        </tasklet>
    </step>
</job>

前面的示例配置适用于加载有关足球的信息的作业 游戏并总结它们。它包含三个步骤:、 和 。该步骤从平面文件 而 STEP 对 Games 执行相同的操作。最后一步 ,然后根据 提供的游戏。假定 加载的文件必须仅加载 一次,但可以加载在特定目录中找到的任何游戏, 在它们成功加载到数据库后将其删除。因此, 该步骤不包含其他配置。它可以启动任何数量 如果完成,则跳过 of times。但是,需要运行该步骤 每次,以防自上次运行以来添加了额外的文件。它已设置为 always be started。(假设 游戏加载到的 Database Table 上有一个进程指示器,以确保 新游戏可以通过 Summarization 步骤正确找到)。汇总步骤 这是作业中最重要的,配置为具有 2 的启动限制。这 非常有用,因为如果该步骤持续失败,则会向 操作符,并且它不能再次启动,直到手动 干预已经发生。playerLoadgameLoadplayerSummarizationplayerLoadgameLoadplayerSummarizationplayerLoadgameLoadplayerLoadgameLoadallow-start-if-completetruespring-doc.cn

此作业为本文档提供了一个示例,与示例项目中的作业不同。footballJob

本节的其余部分描述了该示例的三次运行中每次运行会发生什么情况。footballJobspring-doc.cn

运行 1:spring-doc.cn

  1. playerLoad运行并成功完成,向牌桌添加 400 名玩家。PLAYERSspring-doc.cn

  2. gameLoad运行和处理 11 个文件的游戏数据,加载其内容 放入表中。GAMESspring-doc.cn

  3. playerSummarization开始处理,并在 5 分钟后失败。spring-doc.cn

运行 2:spring-doc.cn

  1. playerLoad不会运行,因为它已经成功完成,并且是(默认值)。allow-start-if-completefalsespring-doc.cn

  2. gameLoad再次运行并处理另外 2 个文件,将其内容也加载到表中(带有进程指示符指示它们尚未加载 已处理)。GAMESspring-doc.cn

  3. playerSummarization开始处理所有剩余的游戏数据(使用 进程指示器),并在 30 分钟后再次失败。spring-doc.cn

运行 3:spring-doc.cn

  1. playerLoad不会运行,因为它已经成功完成,并且是(默认值)。allow-start-if-completefalsespring-doc.cn

  2. gameLoad再次运行并处理另外 2 个文件,将其内容也加载到表中(带有进程指示符指示它们尚未加载 已处理)。GAMESspring-doc.cn

  3. playerSummarization未启动,并且 Job 会立即终止,因为这是 的第三次执行 ,其限制仅为 2。要么是极限 必须引发,否则必须作为新的 .playerSummarizationJobJobInstancespring-doc.cn