Joblauncher实现作业调度
前端
controller:
监听:
public class JobLauncherDemo implements StepExecutionListener{
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Autowired
private Map<String,JobParameters> parameters;
@Bean
public Job jobLauncherDemoJob() {
return jobBuilderFactory.get("jobLauncherDemoJob")
.listener(this)
.start(jobLauncherDemoStep())
.build();
}
@Bean
public Step jobLauncherDemoStep() {
return stepBuilderFactory.get("jobLauncherDemoStep")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
System.out.println("jobLauncherDemoStep,msg: "+parameter.get("msg").getValue());
return RepeatStatus.FINISHED;
}
}).build();
}
@Override
public void beforeStep(StepExecution stepExcution){
parameter = stepExcution.getJobParameters().getParameters();
}
JobOperator使用
对Joblauncher的封装
前端:
<input type="text" id="msg">
<button onclick="runJob2()">Run Job 2</button>
<script type="text/javascript">
var baseurl="http://localhost:8080";
var xhttp=new XMLHttpRequest();
function runJob1(){
var msg = document.getElementById('msg').value;
var url = baseurl + '/job/' +msg;
xhttp.open('GET',url,true);
xhttp.send();
xhttp.onreadystatechange = function(){
if(this.readyState == 4 && this.status ==200){
console.log('Job status: '+this.responseText);
}
}
}
</script>
控制器controller:
”jobOperatorDemoJob“:只是一个字符串。
msg可以直接键值对传过去。
JobOperator需要自己生成Bean。
创建JobRegistrar:
1.创建JobRegistryBeanPostProcessor
2.设置jobRegistry
3.设置BeanFactory,而BeanFactory需要上下文appliactionContext(实现ApplicationAware自动注入)得到
4.通过afterPropertiesSet更新。
1生成simpleJobOperator实例.
2.设置job启动对象joblauncher(框架可以直接注入)
3.将msg转换为Jobparameters类型,使用默认的参数转换类型:DefaultJobParametersConverter。
4.设置job持久化,(框架可以直接注入)
5.设置jobExplor(可以获取和任务相关的信息:JobInstance)(框架可以直接注入)
6.设置job注册:在controller中,jobOperatorDemoJob只是个字符串,并不是job对象。将字符串和具体的任务对象关联起来,就需要注册
使用parameter中的msg信息
自动注入application