gpt4 book ai didi

spring-batch - 没有输入读取时如何结束工作

转载 作者:行者123 更新时间:2023-12-05 06:47:00 26 4
gpt4 key购买 nike

我们从数据库中读取大部分数据。有时结果集是空的,对于这种情况,我们希望作业立即停止,而不是移交给编写器。如果没有输入,我们不想创建文件。

目前我们通过一个返回特定字符串的步骤监听器来实现这个目标,它是转换到下一个业务步骤或删除步骤的输入,删除我们之前创建的文件(文件包含没有真实数据)。

我希望在读者意识到没有输入后作业结束吗?

最佳答案

新编辑(更优雅的方式)

这种方法是在找不到文件时优雅地转到下一步或结束批处理应用程序,并防止执行不需要的步骤(以及它们的监听器)。

-> 检查 tasklet 中是否存在文件,比如 FileValidatorTasklet

-> 当找不到文件时设置一些退出状态(枚举或最终字符串),这里我们设置了 EXIT_CODE

样本小任务

public class FileValidatorTasklet implements Tasklet {
static final String EXIT_CODE = "SOME_EXIT_CODE";
static final String EXIT_DESC = "SOME_EXIT_DESC";
@Override
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
boolean isFileFound = false;
//do file check and set isFileFound
if(!isFileFound){
stepContribution.setExitStatus(new ExitStatus(EXIT_CODE, EXIT_DESC));
}
return RepeatStatus.FINISHED;
}
}

-> 执行 FileValidatorTasklet 后,在此应用程序的作业配置中,检查是否存在 EXIT_CODE

-> 如果找到代码,则提供此作业的后续路径,否则作业的正常流程。(如果找到 EXIT_CODE,我们只是简单地终止作业,否则继续下一个步骤)

示例配置

public Job myJob(JobBuilderFactory jobs) {
return jobs.get("offersLoaderJob")
.start(fileValidatorStep).on(EXIT_CODE).end() // if EXIT_CODE is found , then end the job
.from(fileValidatorStep) // else continue the job from here, after this step
.next(step2)
.next(finalStep)
.end()
.build();

}

这里我们利用了 spring batch 中的条件步骤流。我们必须从步骤 A 定义两个单独的路径。流程就像 A->B->C 或 A->D->E。

旧答案:

我已经经历过这个,因此我分享我的方法。最好是

抛出新的 RunTimeException("msg");

它将开始终止 Spring 应用程序,而不是在该点准确终止。 (reader/writer)中的close()等所有方法都会被调用,所有bean的destroy方法都会被调用。

注意:在 Listener 中执行此操作时,请记住此时所有 bean 都已初始化,并且初始化中的代码(如 afterPropertySet() )已执行。

我认为上面的方法是正确的,但是如果你只愿意在那个时候终止,你可以试试System.exit(1);

关于spring-batch - 没有输入读取时如何结束工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12732414/

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