Quartz入门
来源:互联网 发布:数据库系统设计 编辑:程序博客网 时间:2024/06/05 07:02
Quartz入门
一.导入依赖
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz --> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.2.1</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-slf4j-impl --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.8.2</version> <!--<scope>test</scope>--> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.8.2</version> </dependency> </dependencies> <build> <finalName>QuartzSample</finalName> </build>
二.编写程序
简述:
Quartz体系简述:
Quartz体系结构包含三个核心概念 1. Job: 是一个接口,只定义一个方法execute(JobExecutionContext context),在实现接口的execute方法中编写所需要定时执行的Job(任务), JobExecutionContext类提供了调度应用的一些信息。Job运行时的信息保存在JobDataMap实例中; 2. JobDetail: Quartz每次调度Job时, 都重新创建一个Job实例, 所以它不直接接受一个Job的实例,相反它接收一个Job实现类(JobDetail:描述Job的实现类及其它相关的静态信息,如Job名字、描述、关联监听器等信息),以便运行时通过newInstance()的反射机制实例化Job。 3. Trigger: 是一个类,描述触发Job执行的时间触发规则。主要有SimpleTrigger和CronTrigger这两个子类。当且仅当需调度一次或者以固定时间间隔周期执行调度,SimpleTrigger是最适合的选择;而CronTrigger则可以通过Cron表达式定义出各种复杂时间规则的调度方案:如工作日周一到周五的15:00~16:00执行调度等;
测试demo简述:
简单的Quartz应用除了线程中调用包含两个类: 1. MyJob.java:定义任务(需要是public) 2. QuartzManager.java:定时器管理类(用来对任务进行操作)
MyJob:
public class MyJob implements Job { public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { // 格式化输出日期(Date) SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); System.out.println(simpleDateFormat.format(new Date())); // 获取任务的具体信息 // 获取任务名 String jobName = jobExecutionContext.getJobDetail().getKey().getName(); // 获取传递的任务参数值 JobDataMap dataMap = jobExecutionContext.getJobDetail().getJobDataMap(); String param = dataMap.getString("param"); System.out.println("传递的参数是: " + param + "; 任务名是: " + jobName); }}
QuartzManager:
public class QuartzManager { // 定时器工厂 private static SchedulerFactory factory = new StdSchedulerFactory(); // 设定 任务组(job group) 的名字(随便设定) private static String JOB_GROUP_NAME = "LZHR_JOBGROUP_NAME"; // 设定 触发器组(trigger group) 的名字(随便设定) private static String TRIGGER_GROUP_NAME = "LZHR_TRIGGERGROUP_NAME"; // 添加一个job public static void addJob(String jobName, Class<? extends Job> cls, String time){ try { Scheduler scheduler = factory.getScheduler(); // 添加一个定时任务 JobDetail jobDetail = JobBuilder.newJob(cls).withIdentity(jobName,JOB_GROUP_NAME).build(); // 给任务添加参数, 可以在任务内部获取到. jobDetail.getJobDataMap().put("param","2222"); // 触发器(2种方式) // 通过时间表达式创建触发器(具体时间表达式可以看最下方注释)// time = "0/2 * * * * ?"; Trigger trigger = TriggerBuilder.newTrigger().withIdentity(jobName, TRIGGER_GROUP_NAME) .withSchedule(CronScheduleBuilder.cronSchedule(time)).build(); // 普通触发器, 不设定具体时间, 从start开始按设定时间间隔计算.// Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", TRIGGER_GROUP_NAME)// .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(Integer.valueOf(time)).repeatForever()).build(); // 添加到scheduler中 scheduler.scheduleJob(jobDetail,trigger); // 如果scheduler没有关闭,就启动 if (!scheduler.isShutdown()){ scheduler.start(); } } catch (SchedulerException e) { e.printStackTrace(); } } // 修改任务的触发时间(使用默认的任务组名,触发器名,触发器组名) public static void modifyJobTime(String jobname, String time){ try { Scheduler scheduler = factory.getScheduler(); // 根据trigger的name和触发器组名获取 // 如果创建触发器的时候是使用SimpleTrigger, 那么这里要强转为SimpleTrigger CronTrigger trigger = (CronTrigger) scheduler.getTrigger(new TriggerKey(jobname,TRIGGER_GROUP_NAME)); System.out.println(trigger); if (trigger == null){ return; } // 获取之前的时间表达式 String oldTime = trigger.getCronExpression(); // 如果前后不一致, 就移除前面的任务, 添加新的 if (!oldTime.equalsIgnoreCase(time)){ // 获取任务信息 JobDetail jobDetail = scheduler.getJobDetail(new JobKey(jobname,JOB_GROUP_NAME)); // 获取任务的class信息 Class jobJobClass = jobDetail.getJobClass(); // 移除之前的任务 removeJob(jobname); // 添加新任务 addJob(jobname, jobJobClass, time); } } catch (SchedulerException e) { e.printStackTrace(); } } // 移除任务 public static void removeJob(String jobname){ try { Scheduler scheduler = factory.getScheduler(); // 先暂停scheduler scheduler.pauseTrigger(new TriggerKey(jobname, TRIGGER_GROUP_NAME)); // 然后将任务从scheduler任务序列中移除 scheduler.unscheduleJob(new TriggerKey(jobname, TRIGGER_GROUP_NAME)); // 最后删除任务 scheduler.deleteJob(new JobKey(jobname, JOB_GROUP_NAME)); } catch (SchedulerException e) { e.printStackTrace(); } } // 启动所有定时任务 public static void startJobs(){ try { Scheduler scheduler = factory.getScheduler(); scheduler.start(); } catch (SchedulerException e) { e.printStackTrace(); } } // 关闭所有定时任务 public static void shutdownJobs(){ try { Scheduler scheduler = factory.getScheduler(); if (! scheduler.isShutdown()){ scheduler.shutdown(); } } catch (SchedulerException e) { e.printStackTrace(); } }}
MainTest:
public class MainTest { @Test public void mainTest(){ try { String job_name = "动态任务调度"; System.out.println("----任务启动: 开始(10秒一次)----"); QuartzManager.addJob(job_name, MyJob.class, "0/10 * * * * ?"); Thread.sleep(2000); System.out.println("====修改时间: 开始(2秒一次)===="); QuartzManager.modifyJobTime(job_name, "0/2 * * * * ?"); Thread.sleep(6000); System.out.println("~~~~移除定时: 开始~~~~"); QuartzManager.removeJob(job_name); System.out.println("****移除成功****"); System.out.println("----再次添加任务: 开始(10秒一次)----"); QuartzManager.addJob(job_name, MyJob.class, "0/10 * * * * ?"); Thread.sleep(60000); System.out.println("~~~~移除定时: 开始~~~~"); QuartzManager.removeJob(job_name); System.out.println("****移除成功****"); } catch (InterruptedException e) { e.printStackTrace(); } }}
阅读全文
0 0
- Quartz 入门
- Quartz入门
- quartz入门
- Quartz入门
- Quartz入门
- Quartz入门
- Quartz入门
- Quartz入门
- Quartz入门
- 【Quartz】Quartz任务调度入门
- Quartz(01) Quartz快速入门
- Quartz入门到精通
- Quartz.NET 入门
- Quartz快速入门指南
- Quartz使用入门
- quartz入门实例
- Quartz---入门级实例
- Quartz.net 入门 总结
- numpy的基本操作
- vue-router相同的地址,如何刷新数据
- Part itemtype解读(2): RelationshipType
- Android下使用Protobuf进行序列化
- 《Apache Flume教程》第四章 Flume数据库数据流
- Quartz入门
- gulp配置文件
- 细说mysql索引
- 观察者模式和委托
- TensorFlow: How to freeze a model and serve it with a python API
- 安卓开发中,onSaveInstanceState和onRestoreInstanceState,调用时机分析
- java 导入csv , 里面 有“”回车换行等,都可以去掉
- webstorm中.vue格式文件中代码高亮显示
- 注释转换