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

处理Spring批处理中的作业参数验证

萧鹏云
2023-03-14

我正在使用Spring batch进行批处理,在进行批处理之前,我想验证所有作业参数,如productName、productID、开始日期、结束日期、productType,如果这些作业参数为null或包含错误值,我必须使验证步骤失败,并使作业失败。

我已经编写了验证步骤和Tasklet,在我的Tasklet中,我计划处理作业参数验证(对所有作业参数执行空检查)。因为我是第一次做Spring批处理,所以我想听听专家的意见,这是处理作业参数验证的正确地方还是有任何有效的方法。如果有人能帮我提供你有价值的建议或例子,那将非常有帮助。

提前感谢您的帮助!谢谢

请在下面找到我的示例代码

MyJobConfig.java

@Configuration
public class MyJobConfig {

    @Autowired
    public JobBuilderFactory jobBuilderFactory;

    @Autowired
    public StepBuilderFactory stepBuilderFactory;

    @Bean("myBatchJob")
    public Job job(@Qualifier("validateProductJobParam") Step validateProductJobParametersStep) {
        Job job = jobBuilderFactory.get("myBatchJob")
                .incrementer(new RunIdIncrementer())
                .start(validateProductJobParametersStep)
                .on("FAILED")
                .end()
                .from(validateProductJobParametersStep).on("*").to(processProductBatch)
                .end()
                .build();
        return job;
    }

    @Bean(name = "validateProductJobParam")
    public Step validateProductJobParametersStep() {
        return stepBuilderFactory.get("validate-product-param")
                .tasklet(new JobParamValidateTasklet())
                .allowStartIfComplete(true)
                .build();
    }

}

JobParamValidateTasklet.java

import org.springframework.batch.core.*;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus;

import java.util.Map;

public class JobParamValidateTasklet implements Tasklet, StepExecutionListener {

    private StepExecution stepExecution;
    private JobExecution jobExecution;
    private bookean isValidation;

    @Override
    public void beforeStep(StepExecution stepExecution) {
        this.stepExecution = stepExecution;
        this.jobExecution = stepExecution.getJobExecution();

    }

    @Override
    public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {

        Map<String,JobParameter> jobMap = jobExecution.getJobParameters().getParameters();

        String productName = (String)jobMap.get("PRODUCT_NAME").getValue();
        String productId = (String)jobMap.get("PRODUCT_ID").getValue();
        String prdouctType = (String)jobMap.get("PRODUCT_TYPE").getValue();

        if (productName == null &&  productId == null && prdouctType == null ) {
            isValidation = false;
        } else {
        isValidation = true;
        }
        
        return null;
    }

    public ExitStatus afterStep(StepExecution stepExecution) {
        if(!isValidation)
            return ExitStatus.FAILED;
        else
            return ExitStatus.COMPLETED;
    }

}

共有1个答案

公良天逸
2023-03-14

Spring批处理将在每次作业执行之前使用JobParametersValidator。您不需要手动调用它,但必须在作业定义中注册它,然后它会自动调用。默认情况下,如果未指定自定义验证器,将使用DefaultJobParametersValidator。

您可以使用https://docs.spring.io/spring-batch/docs/4.3.x/reference/html/job.html#jobparametersvalidator参考文档它显示了如何注册验证器。

更新您的MyJobConfig。分类如下:

@Bean("myBatchJob")
public Job job(@Qualifier("validateProductJobParam") Step validateProductJobParametersStep) {
    Job job = jobBuilderFactory.get("myBatchJob")
            .incrementer(new RunIdIncrementer()).validator(validate())
            .start(processProductBatch)
            .end()
            .build();
    return job;
}

//验证的实施

@Bean
public JobParametersValidator validate() {
    JobParametersValidator j = new JobParametersValidator() {
        
        @Override
        public void validate(JobParameters jparams) throws JobParametersInvalidException {
            Map<String, JobParameter> params = jparams.getParameters();
            if(null == params.get("PRODUCT_NAME").getValue() || null == params.get("PRODUCT_ID").getValue()
                    || null == params.get("PRODUCT_TYPE").getValue()){
                throw new JobParametersInvalidException("Cant be null");
            }
        }
    };
    return j;       
}
 类似资料:
  • 我有以下工作要处理在一定的时间间隔或特别的基础上。 作业中的步骤如下: 我也想要用户界面,在那里我可以触发一个特别的基础上的工作,而且我应该能够提供参数从用户界面。 我想用Spring batch来完成这个任务,但它更多的是用于读->处理->写之类的工作。这里,在第一步中,我正在生成由第二步读取的数据。我不确定我是否还可以使用Spring batch来实现这个,或者有更好的方法来实现这个。

  • 我当前正在命令行中传递文件名在spring批处理作业中的参数并运行我的作业,spring批处理作业将查找文件并读取、处理和写入该文件。我目前在读取器中的作业参数文件名和读取器文件名,如何才能在处理器和写入器中使用相同的作业参数文件名。

  • 我有以下Spring批处理作业配置: 我用以下代码开始这项工作: 如何从作业步骤访问参数?

  • 我有一个Spring批处理tasklet,我不知道如何从中失败。我想检查某些参数,如果它们不存在,则在该步骤中使作业失败。 注释掉的行是我试图让工作退出的行。有人有过这样的经历吗?

  • 我已经开始探索Spring Batch,并遇到了一些基本问题。