Spring批处理重试不';如果应用程序实现CommandLineRunner,则无法在Java中工作

Spring批处理重试不';如果应用程序实现CommandLineRunner,则无法在Java中工作,java,spring-boot,command-line,spring-batch,spring-retry,Java,Spring Boot,Command Line,Spring Batch,Spring Retry,作为参考,我签入了下面的spring批处理读取器重试示例的代码,重试功能按预期工作。 但是,实现CommandLineRunner(如下代码所示)时,重试功能不起作用。。。有人能提供建议吗 @SpringBootApplication @EnableBatchProcessing @Data @NoArgsConstructor @AllArgsConstructor @EnableRetry public class Stack56170179Application implements Co

作为参考,我签入了下面的spring批处理读取器重试示例的代码,重试功能按预期工作。 但是,实现CommandLineRunner(如下代码所示)时,重试功能不起作用。。。有人能提供建议吗

@SpringBootApplication
@EnableBatchProcessing
@Data
@NoArgsConstructor
@AllArgsConstructor
@EnableRetry
public class Stack56170179Application implements CommandLineRunner {

    @Autowired
    JobLauncher jobLauncher;

    @Autowired
    private JobBuilderFactory jobs;

    @Autowired
    private StepBuilderFactory steps;

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

    @Bean
    public Job job() {
        return jobs.get("myJob").start(step1()).build();
    }

    @Bean
    public Step step1() {
        return steps.get("step1").<String, String>chunk(1).reader(myReader())
                .processor(myProcessor())
                .writer(myWriter())
                .build();
    }

    @Override
    public void run(String... args) throws Exception {
        JobParameters params = new JobParametersBuilder()
                .addString("JobID", String.valueOf(System.currentTimeMillis()))
                .toJobParameters();
        jobLauncher.run(job(), params);
    }

    @Bean
    @StepScope
    public MyReader myReader() {
        return new MyReader();
    }

    @Bean
    @StepScope
    public MyProcessor myProcessor() {
        return new MyProcessor();
    }

    @Bean
    @StepScope
    public MyWriter myWriter() {
        return new MyWriter();
    }

}

public class MyReader implements ItemReader<String> {

    private long count;
    private long retryCount;

    @Override
    @Retryable(include = { MyException.class }, maxAttempts = 5)
    public String read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {
        final long value = count;
        System.out.println("MyReader : " + value);

        if (value == 3 && retryCount <= 2) {
            retryCount++;
            System.out.println("****");
            Thread.sleep(500);
            throw new MyException();
        }

        if (value < 5) {
            count++;
            Thread.sleep(500);
            return String.valueOf(value);
        } else {
            return null;
        }
    }
}


public class MyProcessor implements ItemProcessor<String, String> {

    @Override
    public String process(final String arg0) throws Exception {
        System.out.println("MyProcessor : " + arg0);
        return arg0;
    }

}


public class MyWriter implements ItemWriter<String> {

    @Override
    public void write(final List<? extends String> arg0) throws Exception {
        System.out.println("MyWriter : " + arg0);
    }

}

public class MyException extends Exception {

    private static final long serialVersionUID = 1L;

}


问题不在于
CommandLineRunner
,而在于
MyReader
对象。您已经创建了普通对象,它不是Spring管理的。 尝试创建spring管理的类bean

 @Bean
 @StepScope
 public MyReader myReader() {
    return new MyReader();
 }
并使用
myReader()
内部方法
step1()
而不是
newmyreader()


希望这有帮助

从您共享的代码中,您希望重试什么?抱歉,我添加了缺少的类,以下是预期的输出:MyReader:0 MyProcessor:0 MyWriter:[0]MyReader:1 MyProcessor:1 MyWriter:[1]MyReader:2 MyProcessor:2 MyWriter:[2]MyReader:3****MyReader:3****MyReader:3****MyReader:3 MyProcessor:3 MyWriter:[3]MyReader:4 MyProcessor:4 MyWriter:[4]MyReader:5在问题中输入预期输出。嗨,斯蒂芬,我将其添加到问题中。嗨,尼特什,我应用了你评论的更改(请参阅原始帖子),但它不起作用。顺便说一句,我在application.properties文件spring.batch.job.enabled=false中添加了批处理,因此该批处理不会在应用程序启动时执行,而是通过run(String…args)方法执行。这样做会引发执行,而不会执行重试。我已将代码与输出一起添加到github。请检查您的pom和java版本。仅供参考,我使用的是java8.Neetesh,非常感谢您的示例,它非常棒;我的错误是,在深入检查我的项目后,我意识到我没有@EnableRetry注释。顺便说一句,我的最终目标是在我的阅读器中使用JdbcCursorItemReader,我能够做到这一点。为了实用,我用FlatFileItemReader创建了一个示例,效果非常好
 @Bean
 @StepScope
 public MyReader myReader() {
    return new MyReader();
 }