我正在使用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;
}
}
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,并遇到了一些基本问题。