为了账号安全,请及时绑定邮箱和手机立即绑定

弹簧批处理停止来自外部类的作业执行

弹簧批处理停止来自外部类的作业执行

qq_笑_17 2022-09-21 17:36:54
我有一个现有的春季批处理项目,该项目有多个步骤。我想修改一个步骤,以便我可以停止作业:。jobExecution.getStatus() == STOPPED我的步骤 :@Autowiredpublic StepBuilderFactory stepBuilderFactory;@Autowiredprivate StepReader reader;@Autowiredprivate StepProcessor processor;@Autowiredprivate StepWriter writer;@Autowiredpublic GenericListener listener;@Bean@JobScope@Qualifier("mystep")public Step MyStep() throws ReaderException {    return stepBuilderFactory.get("mystep")            .reader(reader.read())            .listener(listener)            .processor(processor)            .writer(writer)            .build();}GenericListener在基本上写入日志的方法之前和之后实现和重写。ItemReadListener, ItemProcessListener, ItemWriteListener这里的重点是返回的类及其方法:StepReaderread()FlatFileItemReader@Componentpublic class StepReader {    public static final String DELIMITER = "|";    @Autowired    private ClassToAccessProperties classToAccessProperties;    private Logger log = Logger.create(StepReader.class);    @Autowired    private FlatFileItemReaderFactory<MyObject> flatFileItemReaderFactory;    public ItemReader<MyObject> read() throws ReaderException {        try {            String csv = classToAccessProperties.getInputCsv();            FlatFileItemReader<MyObject> reader = flatFileItemReaderFactory.create(csv, getLineMapper());            return reader;        } catch (ReaderException | EmptyInputfileException | IOException e) {            throw new ReaderException(e);        } catch (NoInputFileException e) {            log.info("Oh no !! No input file");            // Here I want to stop the job            return null;        }    }我试图实现,但没有运气,我认为是因为方法期望从方法中得到一个,它不关心类的其余部分。StepExecutionListenerStepReaderreaderStepBuilderFactoryItemReaderreader.read()我正在寻找想法或解决方案,以便能够在被捕获时停止整个工作(而不是失败)。NoInputFileException爪哇岛春天弹簧批次
查看完整描述

1 回答

?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

我正在寻找一些想法或解决方案,以便在捕获到无输入文件异常时能够停止整个作业(而不是失败)。


这是一种常见的模式,在参考文档的“找不到输入时处理步骤完成”部分中进行了详细介绍。该部分中的示例显示了如何在找不到输入文件时使作业失败,但由于您希望停止作业而不是失败,因此可以在侦听器中使用,并且您的作业将以状态 结束。在您的示例中,您将向该步骤添加该侦听器。StepExecution#setTerminateOnly();STOPPEDMyStep


但是,我建议添加一个预验证步骤,如果没有文件,则停止作业。下面是一个快速示例:


import org.springframework.batch.core.Job;

import org.springframework.batch.core.JobExecution;

import org.springframework.batch.core.JobParameters;

import org.springframework.batch.core.Step;

import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;

import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;

import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;

import org.springframework.batch.core.launch.JobLauncher;

import org.springframework.batch.repeat.RepeatStatus;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.context.ApplicationContext;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;


@Configuration

@EnableBatchProcessing

public class MyJob {


    @Autowired

    private JobBuilderFactory jobs;


    @Autowired

    private StepBuilderFactory steps;


    @Bean

    public Step fileValidationStep() {

        return steps.get("fileValidationStep")

                .tasklet((contribution, chunkContext) -> {

                    // TODO add code to check if the file exists

                    System.out.println("file not found");

                    chunkContext.getStepContext().getStepExecution().setTerminateOnly();

                    return RepeatStatus.FINISHED;

                })

                .build();

    }


    @Bean

    public Step fileProcessingStep() {

        return steps.get("fileProcessingStep")

                .tasklet((contribution, chunkContext) -> {

                    System.out.println("processing file");

                    return RepeatStatus.FINISHED;

                })

                .build();

    }


    @Bean

    public Job job() {

        return jobs.get("job")

                .start(fileValidationStep())

                .next(fileProcessingStep())

                .build();

    }


    public static void main(String[] args) throws Exception {

        ApplicationContext context = new AnnotationConfigApplicationContext(MyJob.class);

        JobLauncher jobLauncher = context.getBean(JobLauncher.class);

        Job job = context.getBean(Job.class);

        JobExecution jobExecution = jobLauncher.run(job, new JobParameters());

        System.out.println("Job status: " + jobExecution.getExitStatus().getExitCode());

    }


}

该示例打印:


file not found

Job status: STOPPED

希望这有帮助。


查看完整回答
反对 回复 2022-09-21
  • 1 回答
  • 0 关注
  • 67 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信