当前位置: 首页 > 知识库问答 >
问题:

在基于块的步骤中中止批处理作业

柳绪
2023-03-14

我在Spring中设置了几个线性步骤。如果在任何一点上,一个步骤失败了,作业应该失败。

这些步骤包括多个微线程,然后是一个基于块的步骤。即。:

  • 步骤1
    • 任务1
    • 小任务2
    • 读者
    • 处理器
    • 作家

    如果出现问题,最明显的做法就是抛出异常。Spring Batch将处理此问题并记录所有内容。这种行为,尤其是打印堆栈跟踪,是不可取的,如果作业可以优雅地结束,并将状态设置为FAILED

    Tasklet当前直接在Step贡献上设置Exitstatus。它们也是使用流构建的(这并不理想,但步骤可以不受阻碍地继续进行)。然后可以直接在Tasklet中处理这些问题。

    然而,在基于块的方法中,我们无法访问步骤贡献。我们只有步执行。使用setExitStatus在这里什么都不做。

    我们使用的是构建器(JobBuilerFactoryStepBuilderFactory),而不是XML设置。

    1. 告诉或配置批处理如何处理异常(而不是打印堆栈跟踪)
    2. 捕获侦听器中的异常。不幸的是,Spring批处理在到达@AfterStep时已经捕获了异常
    3. 告诉步骤/作业我们不想继续(例如,在执行上下文中设置一个值或为步骤贡献设置一个替代值)

共有3个答案

陈兴朝
2023-03-14

在我的例子中,我最终添加了条件,并在读卡器和处理器中抛出了JobInterruptedException

import org.springframework.batch.core.BatchStatus;
import org.springframework.batch.core.JobInterruptedException;

public class CustomReader implements ItemReader<String> {

  @Override
  public String read() throws Exception {
    // ...

    // if ("condition to stop job") {
      throw new JobInterruptedException("Aborting Job", BatchStatus.ABANDONED);
    // }
  }

}
浦泳
2023-03-14

我认为你可以探索以下两个选项。

选项1:您可以使用noSkip异常。

这会显式地防止跳过某些异常(和子类),并引发您希望作业失败的特定异常。

这就是如何配置帽子

stepBuilderFactory.get("myStep")
                .<POJO, POJO> chunk(1000)
                .reader(reader)
                .processor(processor)
                .writer(writer)
                .faultTolerant()
                .noSkip(YourCustomException.class)
                .skip(Exception.class)
                .skipLimit(100) 

****选项2**:**您可以在步骤完成后将退出状态设置为FAILED以获取错误流

public class MyStepExecutionListener implements StepExecutionListener {

    @Override
    public ExitStatus afterStep(StepExecution stepExecution) {


    if(allIsGood()) // 
    {
         return ExitStatus.COMPLETED;
    }
    else if (someExceptionOrErrorCase()){   

        return ExitStatus.FAILED;
    }
 }

 }

希望这能有所帮助

高鸿振
2023-03-14

据我所知,停止作业的唯一方法是抛出异常。没有其他优雅的方式告诉Spring Batch“这项工作完成了,它失败了,直接转到失败,不要通过GO等。”

虽然不是原始问题的直接解决方案,但可以使用。exceptionHandler()是一个StepBuilder的,可以更好地控制抛出的异常,例如记录它们。

public class LogAndRethrowExceptionHandler implements ExceptionHandler {
    private static final Logger LOGGER = Logger.getLogger(...);

    @Override
    public void handleException(RepeatContext repeatContext, Throwable throwable) throws Throwable {
        LOGGER.error(throwable.getMessage());
        throw throwable;
    }
}

理论上,通过这种方式,您可以隐藏Spring Batch生成的堆栈跟踪,但仍然显示错误消息

 类似资料:
  • 我第一次使用Spring batch,我需要一些关于验证步骤的帮助。 在真正开始我的批处理作业之前,我需要对要处理的文件进行一些验证,例如: 使用数据库中的信息检查名称 使用来自系统和数据库的信息检查第一行和最后一行(特定) 用第一行中的数据检查总行号 在那之后,我真的可以开始我的批处理工作了。 我认为有多个步骤相互链接,第一步进行验证,如果文件无效,则进入错误步骤。 我如何进行验证?所有找到的阅

  • 我有一个spring批处理作业,它接收平面文件,处理记录,并将输出写入另一个平面文件。我分别使用了和作为读写器。然而,当我尝试实现多线程步骤时,我的工作无法正常工作。我在日志文件中收到以下警告 你能帮我实现多线程步骤吗?

  • 我正在尝试在Spring批处理中并行运行多个作业。在谷歌上搜索了很多之后,我遇到了JobStep。有没有人使用过JobStep可以解释如何使用它来并行运行作业,或者有没有其他方法可以并行运行2个独立的作业,即当我启动批处理时,2个作业应该开始并行运行。我的要求就像 当我的应用程序启动时,两个作业都应该开始运行。使用spring batch是否可以这样做 编辑:我甚至试过这种方法 我面临着例外。sp

  • 你可以点击 “设置任务计划”来为一个批处理作业设置计划和点击 “删除任务计划”来移除计划。 如果你在“常规”选项卡选择“不管用户是否登录都要运行”,当你保存计划时你必须在 Windows 计划程序提供你的操作系统用户密码。 【注意】请在设置计划之前保存批处理作业。在运行计划之前,在连接窗口内的密码必须保存。

  • 添加工作到批处理作业 在“常规”选项卡的底部窗格中,选择工作类型,然后如有需要浏览连接、数据库和/或模式以找出你想运行的工作。 你可以双击或拖放工作来将工作从“可用的工作”列表移动到“已选择的工作”列表。若要从已选择的工作列表删除工作,请以相同的方式移除它们。你可以在一个批处理作业中运行来自不同服务器的配置文件。 若要重新排序工作的序列,可使用 “上移”或 “下移”按钮。 如果你想备份整个服务器,

  • 你可以点击 来为一个批处理作业设置计划和点击 来移除计划。 “小时”和“分钟”字段必需指定。如果字段没有任何值,将会使用全部值。例如,如果“星期”字段是空的,系统会视为这个字段被输入“0, 1, 2, 3, 4, 5, 6”。使用逗号以分隔值。例如,0, 1, 3, 6。使用连字号 (-),不含空格以指示值。例如,0-4。 例子:批处理作业将会在每个工作日下午 6:30 运行。 【注意】请在设置计