Quartz实现简单定时任务
一个简单的Quartz定时功能,是一个单独的定时任务而不是集群,功能非常非常简单,用的是cron表达式,在前端页面中写了个下拉框,将cron写死了,每一选项都在后端对应了写好的表达式。
本来这个switch是写在前端的,但是传参回来之后问号总是丢,就直接写在了后端。
下面这个是controller类,一个JobDetail,一个触发器,一个Scheduler
@RestController
@RequestMapping("/sjzh")
public class UpdateKtrController {
/**
* 启动ktr
* @param ktrName
*/
@GetMapping("/run/{ktrName}/{cronName}")
public void RunKtr(@PathVariable("ktrName") String ktrName,@PathVariable("cronName") String cronName) {
String cronEx;
switch (cronName){
case "每年一次":
cronEx = "0 0 15 12 1 ? *";
break;
case "每月一次":
cronEx = "0 0 0 1 * ?";
break;
case "每周一次":
cronEx = "0 0 2 ? * 1";
break;
case "每日一次":
cronEx = "0 53 16 * * ?";
break;
default:
cronEx = "";
}
//定时任务具体内容
/**
* usingJobData用来给JobDetail中存储一些kv键值对
*/
JobDetail jobDetail = JobBuilder.newJob(QuartzJob.class)
.usingJobData("var",ktrName)
.withIdentity("Job1","group1")
.build();
//任务对应的触发器
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger1","group1")
.startNow()
/*.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1).repeatForever())*/
.withSchedule(CronScheduleBuilder.cronSchedule(cronEx))
.build();
//Scheduler用来对任务进行调度,每一个Scheduler都包含一个具体的任务和触发器
try {
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.scheduleJob(jobDetail,trigger);
scheduler.start();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}
具体的任务实现类:
public class QuartzJob implements Job {
@Autowired
private UpdateKtrServiceImpl updateKtrService;
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException{
JobDataMap jobDataMap = jobExecutionContext.getJobDetail().getJobDataMap();
String ktrName = jobDataMap.getString("var");
updateKtrService = (UpdateKtrServiceImpl) SpringContextJobUtil.getBean("updateKtrServiceImpl");
try {
this.updateKtrService.RunKtr( "etl/"+ktrName+".ktr");
} catch (KettleException e) {
e.printStackTrace();
}
}
}
这里最开始的时候,我是没有写
updateKtrService = (UpdateKtrServiceImpl)SpringContextJobUtil.getBean(“updateKtrServiceImpl”);
直接调用updateKtrService,报了null对象错
再加上静态工具类SpringContextJobUtil之后,又一直在报找不到bean的错误
@Component
public class SpringContextJobUtil implements ApplicationContextAware {
private static ApplicationContext context;
@Override
@SuppressWarnings("static-access" )
public void setApplicationContext(ApplicationContext contex)
throws BeansException {
// TODO Auto-generated method stub
this.context = contex;
}
public static Object getBean(String beanName){
return context.getBean(beanName);
}
public static String getMessage(String key){
return context.getMessage(key, null, Locale.getDefault());
}
}
又仔细检查之后,才发现调用的serviceImpl类上的Service注解名字不对!!!
修改之后终于成功。
参考文章:
https://blog.youkuaiyun.com/qq_41604862/article/details/79590688
https://blog.youkuaiyun.com/xt314159/article/details/108345027
https://www.jianshu.com/p/aff9199b4416