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

Sptring批处理:在初始化Spring Boot上下文期间处理异常

祖迪
2023-03-14

在Spring Boot上下文的初始化过程中,有什么方法可以处理异常吗?

我的案例是在作业执行过程中处理错误,并根据发生的异常做一些工作。

例如,我有一个由读者和作家组成的工作。读取器和写入器使用以下属性初始化:rootFolder、inFolder、outfolder。这个简单的作业从/rootfolder/infolder/test.txt读取文件,并将数据写入rootfolder/outfolder/test.txt。

有没有办法添加通用侦听器来拦截和分析错误?

代码示例配置类:

@Configuration
public class JobConfiguration {

   @Autowired
   public JobConfiguration(JobSpecificProperties properties) {
       this.properties = properties;
   }

   private final JobSpecificProperties properties;

   @Bean
   public Job job(JobBuilderFactory jobBuilderFactory, Step step) {
       return jobBuilderFactory.get("jobName")
               .incrementer(new RunIdIncrementer())
               .listener(new SystemExitOnFailureJobExecutionListener())
               .start(step)
               .build();
   }

   @Bean
   public Step step(StepBuilderFactory stepBuilderFactory,
                 ItemReader<String> itemReader,
                 ItemWriter<String> itemWriter) {
       return stepBuilderFactory.get("stepName")
               .<String, String>chunk(Integer.MAX_VALUE)
               .reader(itemReader)
               .writer(itemWriter)
               .build();
   }

   @Bean
   public ItemReader<String> itemReader() {
       FlatFileItemReader<String> reader = new FlatFileItemReader<>();
       reader.setStrict(false);
       reader.setLineMapper((string, index) -> string);
       reader.setResource(new FileSystemResource(Paths.get(properties.getRootFolder(), properties.getInFolder()).resolve("test.txt").toString()));

       return reader;
   }

   @Bean
   public ItemWriter<String> itemWriter() {
       FlatFileItemWriter<String> writer = new FlatFileItemWriter<>();
       writer.setLineAggregator(string -> string);
       writer.setResource(new FileSystemResource(Paths.get(properties.getRootFolder(), properties.getOutFolder()).resolve("test.txt").toString()));

       return writer;
   }
}

代码示例侦听器类:

@Slf4j
public class SystemExitOnFailureJobExecutionListener extends JobExecutionListenerSupport {
    @Override
    public void afterJob(JobExecution jobExecution) {
        if (jobExecution.getStatus() == BatchStatus.FAILED) {
            if (jobExecution.getAllFailureExceptions().get(0) instanceof NullPointerException){
                log.error("some_message_1");
                //TODO: Do something
                System.exit(2);
            } else if (jobExecution.getAllFailureExceptions().get(0) instanceof InvalidPathException){
                log.error("some_message_2");
                //TODO: Do something
                System.exit(3);
            }

            //TODO: Do something by default
            System.exit(1);
        }
   }
}
@Getter
@Setter
@ConfigurationProperties("job.parameter")
public class JobSpecificProperties {
    private String rootFolder;
    private String outFolder;
    private String inFolder;
}
@SpringBootApplication
@EnableBatchProcessing
@EnableConfigurationProperties(JobSpecificProperties.class)
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

共有1个答案

李和裕
2023-03-14

我希望扩展类AlwaysSkipItemSkipPolicy在作业/步骤级别使用该类。

@Override
public boolean shouldSkip(java.lang.Throwable t, int skipCount){
     if(t instanceof NonSkippableReadException){
                return true;
     }
     return false;
}

有关处理零件的更多信息,请参阅

https://docs.spring.io/spring-batch/4.1.x/reference/html/step.html

public interface SkipListener<T,S> extends StepListener {

    void onSkipInRead(Throwable t);
    void onSkipInProcess(T item, Throwable t);
    void onSkipInWrite(S item, Throwable t);

}

@onskipinread

@onskipinwrite

@OnSkipInProcess

 类似资料:
  • 如何在批处理模式的情况下处理反序列化异常? 我正在使用Spring boot-2.3.8版本的Spring kafka。 尝试过此选项: 但它抛出了一个异常:由java引起。lang.IllegalStateException:错误处理程序必须是ErrorHandler,而不是org。springframework。Kafka。听众。请参阅OcuCurrentBatchErrorHandler 以

  • 我有一个Spring批处理工作,分两步。第一个下载文件,第二个处理文件。问题是,在第一步运行之前,第二步不知道文件的名称。 作业已自动实例化这些步骤,以便在需要时运行。我想不出任何方法来确保第一步运行后该步骤会初始化。 以下是代码: 你可以看到获取我在第一步的Tasklet中设置的局部变量。

  • 我试图在JUnit 5和SpringBatchTest注释中加载JobLauncherTestUtils对象。但是,它无法加载应用程序上下文。所有其他自动构建的bean都成功加载,但是JobLauncherTestUtils无法加载。这是我的测试配置,省略了导入。我尝试在BeforeAll中手动加载它,但是JobRepository和JobLauncher无法加载。我只对能够成功实例化JobLau

  • 我对Spring批处理跳过逻辑有一些问题。我已经配置了一个作业的步骤来跳过两个异常(SQLIntegrityConstraintViolation异常和乐观锁定失败异常): 但当作业运行时,由于我将其配置为跳过的异常,作业以未知状态完成: 我做错什么了吗?我希望这一步跳过负责抛出其中一个异常的项,并继续处理,以便以完成状态结束。

  • 主要内容:日期,时间,日期格式化:年-月-日DOS脚本中的日期和时间具有以下两个用于检索系统日期和时间的基本命令。 日期 该命令获取系统日期。 语法 示例 当前日期将显示在命令提示符下。 例如, 时间 该命令设置或显示时间。 语法 示例 当前时间将显示在命令提示符下。 例如, 以下是一些可用于以不同格式获取日期和时间的实现。 日期格式化:年-月-日 示例 以上命令产生以下输出 -

  • 本文向大家介绍javascript日期处理函数,性能优化批处理,包括了javascript日期处理函数,性能优化批处理的使用技巧和注意事项,需要的朋友参考一下 其实网上写javascript日期格式化的博文很多,大体都看了看,都还不错。唯一遗憾的是只顾着实现了功能,没对函数进行性能优化。 俗话说:不要重复造轮子。google上找了一个比较不错的日期格式化函数,来开始我的优化之旅吧! google上