Spring Batch框架提供了Job作业参数的校验功能,可以让开发者决定哪些参数是必须的,哪些参数是可选的。开发者可以自定义实现参数校验器,这需要实现接口:org.springframework.batch.core.JobParametersValidator,也可以使用框架已经提供的校验组件类。
框架提供的校验组件类:
- CompositeJobParametersValidator
- DefaultJobParametersValidator
项目实现举例:
1.项目框架
2.具体代码
Demo4BatchMain.java:
package com.xj.demo4;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.JobParametersBuilder;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.Date;
/**
* @Author : xjfu
* @Date : 2021/11/11 8:48
* @Description :Job 参数校验启动类
*/
public class Demo4BatchMain {
public static void main(String[] args) {
Demo4BatchMain batchMain = new Demo4BatchMain();
System.out.println("**************第一次执行 Begin**************");
//不会报错,因为要求必须要有date参数
batchMain.executeJob("demo4/job/demo4-job.xml", "demo4Job", "jobLauncher",new JobParametersBuilder().addDate("date",new Date()).toJobParameters());
System.out.println("**************第一次执行 End**************");
System.out.println("**************第二次执行 Begin**************");
//会报错,因为没有规定有“test”参数
batchMain.executeJob("demo4/job/demo4-job.xml", "demo4Job", "jobLauncher",new JobParametersBuilder().addDate("date",new Date()).addString("test","test parameter").toJobParameters());
System.out.println("**************第二次执行 End**************");
}
/**
*执行Job
* @param jobXmlPath 配置job的xml文件路径
* @param jobId job的id
* @param jobLauncherId jobLauncher的id
* @param jobParameters 参数
*/
public void executeJob(String jobXmlPath, String jobId, String jobLauncherId, JobParameters jobParameters){
ApplicationContext context = new ClassPathXmlApplicationContext(jobXmlPath);
//Spring Batch的作业启动器
JobLauncher launcher = (JobLauncher) context.getBean(jobLauncherId);
//获取要执行的Job
Job job = (Job) context.getBean(jobId);
try{
//开始执行作业
JobExecution result = launcher.run(job,jobParameters);
//输出执行结果
System.out.println(result.toString());
}catch (Exception e){
e.printStackTrace();
}
}
}
JobParametersTasklet.java:
package com.xj.demo4;
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus;
/**
* @Author : xjfu
* @Date : 2021/11/11 8:50
* @Description :Job 参数校验Tasklet
*/
public class JobParametersTasklet implements Tasklet {
@Override
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
System.out.println("进入 Job Parameters 的 Tasklet");
return RepeatStatus.FINISHED;
}
}
demo4-job.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:batch="http://www.springframework.org/schema/batch"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/batch http://www.springframework.org/schema/batch/spring-batch.xsd">
<import resource="classpath:demo4/job/demo4-jobContext.xml"/>
<!--定义job-->
<batch:job id="demo4Job">
<batch:step id="demo4Step">
<batch:tasklet ref="jobParametersTasklet"/>
</batch:step>
<!--配置参数校验-->
<batch:validator ref="validator"/>
</batch:job>
</beans>
demo4-jobContext.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--定义jobRepository-->
<bean id="jobRepository" class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean"/>
<!--定义事务管理器-->
<bean id="transactionManager" class="org.springframework.batch.support.transaction.ResourcelessTransactionManager"/>
<!--定义jobLauncher-->
<bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
<property name="jobRepository" ref="jobRepository"/>
</bean>
<!--定义Tasklet-->
<bean id="jobParametersTasklet" class="com.xj.demo4.JobParametersTasklet"/>
<!--参数校验-->
<bean id="validator" class="org.springframework.batch.core.job.DefaultJobParametersValidator">
<!--必须输入参数-->
<property name="requiredKeys">
<set>
<value>date</value>
</set>
</property>
<!--可选输入参数-->
<property name="optionalKeys">
<set>
<value>name</value>
</set>
</property>
</bean>
</beans>
这里我们使用框架提供的DefaultJobParametersValidator校验组件,其中定义了两个参数,一个是"date",为必须参数;另一个是"name",为可选参数。