用quartz执行并运维job
用spring本身可以做一些定时任务,更多的是配置一些定时任务。但是如果通过数据库甚至页面控制定时任务启停,启之前从数据库里取些定时任务相关配置,实时从页面对任务进行修改等,我更喜欢用quartz。
quartz的依赖
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.2.1</version> <exclusions> <exclusion> <artifactId>slf4j-api</artifactId> <groupId>org.slf4j</groupId> </exclusion> </exclusions> </dependency>
quartz主要包括四个部分,任务job,任务描述jobDetail,触发器Trigger,调度器Scheduler。
job-----任务
这里面主要写定时执行的任务,比如向数据库某种表录入数据之类。这个类注意几点:
-
继承Job
-
重写execute方面里面怎么拿到spring容器的问题
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class DemoTask implements Job { @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { log.debug("execute demo start" + new Date()); //注意这个类execute方法里面直接注入dao是拿不到的,要通过JobDataMap传递,哪里放进来后面说 DemoDao demoDao = (DemoDao) jobExecutionContext.getJobDetail().getJobDataMap() .get("demoDao"); doTask(demoDao); //调业务方法 log.info("execute demo end" + new Date()); } }
把任务描述jobDetail,触发器Trigger注册到调度器Scheduler
包括:
jobDetail 绑定job实例,jobDetail里塞入参数;
Trigger塞入参数;
jobDetail,Trigger注册到Scheduler
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
@Service public class DemoImpl implements DemoService { //用来代表业务操作业务数据表 @Autowired DemoDao demoDao; //用来代表获取记录定时器配置的表 @Autowired DeployDao deployDao; @Autowired private SchedulerFactory schedulerFactory; Scheduler scheduler = null; /** * 启动调度器 */ public String start() throws SchedulerException { String result; scheduler = schedulerFactory.getScheduler(); result = scheduleJob1(scheduler); scheduler.start(); return result; } private String scheduleJob1(Scheduler scheduler) throws SchedulerException { //***任务描述jobDetail部分*** //JobDataMap用于传递spring容器到job里 JobDataMap jobDataMap = new JobDataMap(); jobDataMap.put("demoDao", demoDao); //用JobBuilder创建之前的job实例 JobBuilder jobBuilder = JobBuilder.newJob(DemoTask.class); //为JobBuilder指定组和job名 jobBuilder.withIdentity("job1", "group1"); //将用于传递的jobDataMap塞入JobBuilder jobBuilder.setJobData(jobDataMap); //用配好的JobBuilder创建JobDetail JobDetail jobDetail = jobBuilder.build(); //***触发器Trigger部分*** //从数据库获取cron表达式,cron提前配置在数据库里的。cron表达式网上有工具可以轻易生成 Deploy deploy = deployDao.getdeploy(); String cron = deploy.getCron(); // 创建cron表达式的规则 CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron); //创建cron触发器,指定组,除非器名字,使用规则 CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1") .withSchedule(scheduleBuilder).build(); //***注册调度器部分***注册调度器 scheduler.scheduleJob(jobDetail, cronTrigger); return "ok"; } }
以上service里就完成里创建一个调度器scheduler并注册任务和触发器的过程。
scheduler自身的一些方法可以用于运维页面
复制代码
1
2
3
4
5
6
7
8
9
10
11
//开启调度器 scheduler.start(); //关闭调度器,等待当前进行任务结束 scheduler.shutdown(true); //立即关闭调度器 scheduler.shutdown(); //反馈当前调度器是否停止 isStart = !scheduler.isShutdown();
装载请标明出处 https://blog.csdn.net/renhuan28/article/details/81745803
最后
以上就是开放大树最近收集整理的关于用quartz执行并运维job的全部内容,更多相关用quartz执行并运维job内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复