使用quartz.jar 、quartz-jobs.jar 实现定时任务 。实现 定时采集 接口数据

前言

  定时任务管理,在java中有很多种的方式 ,有java自带的注解方式@Scheduled  等 ,现在我要说的是一种也是使用比较广泛的一种quartz管理
  使用此类 需要的加jar包有 quartz.jar 、quartz-jobs.jar (我这里用的版本是2.2.1)

首先-创建一个quartz管理类 ,这个类中添加各种情况下 可使用的那些调用方法

  

  1 public class QuartzManager {
  2     private static SchedulerFactory gSchedulerFactory = new StdSchedulerFactory();  //创建一个SchedulerFactory工厂实例
  3     private static String JOB_GROUP_NAME = "FH_JOBGROUP_NAME";                      //任务组
  4     private static String TRIGGER_GROUP_NAME = "FH_TRIGGERGROUP_NAME";              //触发器组
  5
  6     /**添加一个定时任务,使用默认的任务组名,触发器名,触发器组名
  7      * @param jobName 任务名
  8      * @param cls 任务
  9      * @param time 时间设置,参考quartz说明文档
 10      */
 11     public static void addJob(String jobName, Class<? extends Job> cls, String time) {
 12         try {
 13             Scheduler sched = gSchedulerFactory.getScheduler();                                          //通过SchedulerFactory构建Scheduler对象
 14             JobDetail jobDetail= JobBuilder.newJob(cls).withIdentity(jobName,JOB_GROUP_NAME).build();    //用于描叙Job实现类及其他的一些静态信息,构建一个作业实例
 15             CronTrigger trigger = (CronTrigger) TriggerBuilder
 16                     .newTrigger()                                                                         //创建一个新的TriggerBuilder来规范一个触发器
 17                     .withIdentity(jobName, TRIGGER_GROUP_NAME)                                            //给触发器起一个名字和组名
 18                     .withSchedule(CronScheduleBuilder.cronSchedule(time))
 19                     .build();
 20             sched.scheduleJob(jobDetail, trigger);
 21             if (!sched.isShutdown()) {
 22                 sched.start();        // 启动
 23             }
 24         } catch (Exception e) {
 25             throw new RuntimeException(e);
 26         }
 27     }
 28
 29     /**添加一个定时任务,使用默认的任务组名,触发器名,触发器组名  (带参数)
 30      * @param jobName 任务名
 31      * @param cls 任务
 32      * @param time 时间设置,参考quartz说明文档
 33      */
 34     public static void addJob(String jobName, Class<? extends Job> cls, String time, Map<String,Object> parameter) {
 35         try {
 36             Scheduler sched = gSchedulerFactory.getScheduler();                                          //通过SchedulerFactory构建Scheduler对象
 37             JobDetail jobDetail= JobBuilder.newJob(cls).withIdentity(jobName,JOB_GROUP_NAME).build();    //用于描叙Job实现类及其他的一些静态信息,构建一个作业实例
 38             jobDetail.getJobDataMap().put("parameterList", parameter);                                //传参数
 39             CronTrigger trigger = (CronTrigger) TriggerBuilder
 40                     .newTrigger()                                                                         //创建一个新的TriggerBuilder来规范一个触发器
 41                     .withIdentity(jobName, TRIGGER_GROUP_NAME)                                            //给触发器起一个名字和组名
 42                     .withSchedule(CronScheduleBuilder.cronSchedule(time))
 43                     .build();
 44             sched.scheduleJob(jobDetail, trigger);
 45             if (!sched.isShutdown()) {
 46                 sched.start();        // 启动
 47             }
 48         } catch (Exception e) {
 49             throw new RuntimeException(e);
 50         }
 51     }
 52
 53     /**添加一个定时任务
 54      * @param jobName    任务名
 55      * @param jobGroupName    任务组名
 56      * @param triggerName    触发器名
 57      * @param triggerGroupName    触发器组名
 58      * @param jobClass    任务
 59      * @param time    时间设置,参考quartz说明文档
 60      */
 61     public static void addJob(String jobName, String jobGroupName,
 62             String triggerName, String triggerGroupName, Class<? extends Job> jobClass,
 63             String time) {
 64         try {
 65             Scheduler sched = gSchedulerFactory.getScheduler();
 66             JobDetail jobDetail= JobBuilder.newJob(jobClass).withIdentity(jobName,jobGroupName).build();// 任务名,任务组,任务执行类
 67             CronTrigger trigger = (CronTrigger) TriggerBuilder     // 触发器
 68                     .newTrigger()
 69                     .withIdentity(triggerName, triggerGroupName)
 70                     .withSchedule(CronScheduleBuilder.cronSchedule(time))
 71                     .build();
 72             sched.scheduleJob(jobDetail, trigger);
 73             if (!sched.isShutdown()) {
 74                 sched.start();        // 启动
 75             }
 76         } catch (Exception e) {
 77             throw new RuntimeException(e);
 78         }
 79     }
 80
 81     /**添加一个定时任务  (带参数)
 82      * @param jobName    任务名
 83      * @param jobGroupName    任务组名
 84      * @param triggerName    触发器名
 85      * @param triggerGroupName    触发器组名
 86      * @param jobClass    任务
 87      * @param time    时间设置,参考quartz说明文档
 88      */
 89     public static void addJob(String jobName, String jobGroupName,
 90             String triggerName, String triggerGroupName, Class<? extends Job> jobClass,
 91             String time, Map<String,Object> parameter) {
 92         try {
 93             Scheduler sched = gSchedulerFactory.getScheduler();
 94             JobDetail jobDetail= JobBuilder.newJob(jobClass).withIdentity(jobName,jobGroupName).build();// 任务名,任务组,任务执行类
 95             jobDetail.getJobDataMap().put("parameterList", parameter);                                //传参数
 96             CronTrigger trigger = (CronTrigger) TriggerBuilder     // 触发器
 97                     .newTrigger()
 98                     .withIdentity(triggerName, triggerGroupName)
 99                     .withSchedule(CronScheduleBuilder.cronSchedule(time))
100                     .build();
101             sched.scheduleJob(jobDetail, trigger);
102             if (!sched.isShutdown()) {
103                 sched.start();        // 启动
104             }
105         } catch (Exception e) {
106             throw new RuntimeException(e);
107         }
108     }
109
110     /** 修改一个任务的触发时间(使用默认的任务组名,触发器名,触发器组名)
111      * @param jobName    任务名
112      * @param time    新的时间设置
113      */
114     public static void modifyJobTime(String jobName, String time) {
115         try {
116             Scheduler sched = gSchedulerFactory.getScheduler();                              //通过SchedulerFactory构建Scheduler对象
117             TriggerKey triggerKey = TriggerKey.triggerKey(jobName,TRIGGER_GROUP_NAME);         //通过触发器名和组名获取TriggerKey
118             CronTrigger trigger = (CronTrigger)sched.getTrigger(triggerKey);                //通过TriggerKey获取CronTrigger
119             if (trigger == null) {
120                 return;
121             }
122             String oldTime = trigger.getCronExpression();
123             if (!oldTime.equalsIgnoreCase(time)) {
124                 JobKey jobKey = JobKey.jobKey(jobName, JOB_GROUP_NAME);                        //通过任务名和组名获取JobKey
125                 JobDetail jobDetail = sched.getJobDetail(jobKey);
126                 Class<? extends Job> objJobClass = jobDetail.getJobClass();
127                 removeJob(jobName);
128                 addJob(jobName, objJobClass, time);
129             }
130         } catch (Exception e) {
131             throw new RuntimeException(e);
132         }
133     }
134
135     /**修改一个任务的触发时间
136      * @param triggerName    任务名称
137      * @param triggerGroupName    传过来的任务名称
138      * @param time    更新后的时间规则
139      */
140     public static void modifyJobTime(String triggerName, String triggerGroupName, String time) {
141         try {
142             Scheduler sched = gSchedulerFactory.getScheduler();                              //通过SchedulerFactory构建Scheduler对象
143             TriggerKey triggerKey = TriggerKey.triggerKey(triggerName,triggerGroupName);     //通过触发器名和组名获取TriggerKey
144             CronTrigger trigger = (CronTrigger)sched.getTrigger(triggerKey);                //通过TriggerKey获取CronTrigger
145             if (trigger == null)  return;
146             CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(trigger.getCronExpression());
147             String oldTime = trigger.getCronExpression();
148             if (!oldTime.equalsIgnoreCase(time)) {
149                 trigger = (CronTrigger)trigger.getTriggerBuilder()        //重新构建trigger
150                         .withIdentity(triggerKey)
151                         .withSchedule(scheduleBuilder)
152                         .withSchedule(CronScheduleBuilder.cronSchedule(time))
153                         .build();
154                 sched.rescheduleJob(triggerKey, trigger);                //按新的trigger重新设置job执行
155             }
156         } catch (Exception e) {
157             throw new RuntimeException(e);
158         }
159     }
160
161     /**移除一个任务(使用默认的任务组名,触发器名,触发器组名)
162      * @param jobName    任务名称
163      */
164     public static void removeJob(String jobName) {
165         try {
166             Scheduler sched = gSchedulerFactory.getScheduler();
167             TriggerKey triggerKey = TriggerKey.triggerKey(jobName,TRIGGER_GROUP_NAME);     //通过触发器名和组名获取TriggerKey
168             JobKey jobKey = JobKey.jobKey(jobName, JOB_GROUP_NAME);                        //通过任务名和组名获取JobKey
169             sched.pauseTrigger(triggerKey);    // 停止触发器
170             sched.unscheduleJob(triggerKey);// 移除触发器
171             sched.deleteJob(jobKey);        // 删除任务
172         } catch (Exception e) {
173             throw new RuntimeException(e);
174         }
175     }
176
177     /**移除一个任务
178      * @param jobName    任务名
179      * @param jobGroupName    任务组名
180      * @param triggerName    触发器名
181      * @param triggerGroupName    触发器组名
182      */
183     public static void removeJob(String jobName, String jobGroupName,String triggerName, String triggerGroupName) {
184         try {
185             Scheduler sched = gSchedulerFactory.getScheduler();
186             TriggerKey triggerKey = TriggerKey.triggerKey(triggerName,triggerGroupName);     //通过触发器名和组名获取TriggerKey
187             JobKey jobKey = JobKey.jobKey(jobName, jobGroupName);                            //通过任务名和组名获取JobKey
188             sched.pauseTrigger(triggerKey);    // 停止触发器
189             sched.unscheduleJob(triggerKey);// 移除触发器
190             sched.deleteJob(jobKey);        // 删除任务
191         } catch (Exception e) {
192             throw new RuntimeException(e);
193         }
194     }
195
196     /**
197      * 启动所有定时任务
198      */
199     public static void startJobs() {
200         try {
201             Scheduler sched = gSchedulerFactory.getScheduler();
202             sched.start();
203         } catch (Exception e) {
204             throw new RuntimeException(e);
205         }
206     }
207
208     /**
209      * 关闭所有定时任务
210      */
211     public static void shutdownJobs() {
212         try {
213             Scheduler sched = gSchedulerFactory.getScheduler();
214             if (!sched.isShutdown()) {
215                 sched.shutdown();
216             }
217         } catch (Exception e) {
218             throw new RuntimeException(e);
219         }
220     }
221 }  

其次-创建 具体任务实现类

  

public class SwapJob implements Job {
    protected Logger logger = Logger.getLogger(this.getClass());

    public void execute(JobExecutionContext context) throws JobExecutionException {
          System.out.println("我现在是每20秒 打印一次哦");/*    这下面的方法 是我 用的Httpclient做测试的 后端请求接收接口数据用的 ,可以不用管,直接删除就好
        String url=null;
        String responseResult=null;
        try {
            //获取HttpClient对象
            HttpClient client =  new HttpClient();
            //设置url
            url = "http://localhost:8080/FrontC/combotree/gover";
            //获取post请求对象
            PostMethod method = new PostMethod(url);
            //执行请求对象 返回请求状态码
            int requestStatus=  client.executeMethod(method);
            //判断是否请求成功

            if(requestStatus==200){
            //接收响应数据
            responseResult = method.getResponseBodyAsString();
            }
             //将String数据转化成json数据   用于之后json转对象使用
            System.out.println(JSONObject.parse(responseResult));
            }catch (Exception e){
                e.printStackTrace();
           } finally {
               System.out.println("请求成功执行!");
        }
*/  
} 
}

最后-使用调用QuartzManager中的方法  ,将参数传入

 public static void main(String[] args) {
                 //任务名称      //具体需要完成的任务  //时间间隔 (想要不用的时间,格式在网上就可以找到)
        QuartzManager.addJob("获取dept数据", SwapJob.class, "0/20 * * * * ?");
    }

结语

 上面是我的可运行的方法  ,需要使用的朋友,直接代码复制 到自己的 项目中就可以 使用了 ,前提是 记得把包给 导入先

 有什么问题 希望 可以在评论区 交流 !

 

时间: 2024-10-10 23:06:28

使用quartz.jar 、quartz-jobs.jar 实现定时任务 。实现 定时采集 接口数据的相关文章

spring boot 整合 quartz 集群环境 实现 动态定时任务配置【原】

最近做了一个spring boot 整合 quartz  实现 动态定时任务配置,在集群环境下运行的 任务.能够对定时任务,动态的进行增删改查,界面效果图如下: 1. 在项目中引入jar 2. 将需要的表导入数据库 官网上有不同数据库的脚本,找到对应的,导入即可 3. java 代码 将quartz 的相关配置文件,配置为暴露bean,方便后期引用. 有一处关键的地方,就是注入spring 上下文,也可以算是一个坑.如果,不注入spring 上下文,那么新添加的定时任务job,是新new 的一个

Quartz学习——Quartz大致介绍(一)

1. 介绍Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,是完全由java开发的一个开源的任务日程管理系统,"任务进度管理器"就是一个在预先确定(被纳入日程)的时间到达时,负责执行(或者通知)其他软件组件的系统.Quartz用一个小Java库发布文件(.jar文件),这个库文件包含了所有Quartz核心功能.这些功能的主要接口(API)是Scheduler接口.它提供了简单的操作,例如:将任务纳入日程或者从日程中取消,开始/停止/暂停日程

spring中各jar功能及jar包之间的依赖关系

(1) spring-core.jar 这个jar文件包含Spring框架基本的核心工具类,Spring其它组件要都要使用到这个包里的类,是其它组件的基本核心,当然你也可以在自己的应用系统中使用这些工具类. (2) spring-beans.jar 这个jar文件是所有应用都要用到的,它包含访问配置文件.创建和管理bean以及进行Inversion of Control / Dependency Injection(IoC/DI)操作相关的所有类.如果应用只需基本的IoC/DI支持,引入spri

【Quartz】Quartz存储与持久化-基于quartz.properties的配置

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 一.   Quartz存储与持久化 Quartz提供两种基本作业存储类型.第一种类型叫做RAMJobStore,第二种类型叫做JDBC作业存储.在默认情况下Quartz将任务调度的运行信息保存在内存中,这种方法提供了最佳的性能,因为内存中数据访问最快.不足之处是缺乏数据的持久性,当程序路途停止或系统崩溃时,所有运行的信息都会丢失. 比如我们希望安排一个执行100次的任务,如果执行到50次时系

Quartz.NET - Quartz.NET Quick Start Guide

转自:http://www.quartz-scheduler.net/documentation/quartz-2.x/quick-start.html Quartz.NET Quick Start Guide Welcome to the Quick Start Guide for Quartz.NET. As you read this guide, expect to see details of: Downloading Quartz.NET Installing Quartz.NET

maven依赖本地非repository中的jar包-依赖jar包放在WEB-INF/lib等目录下的情况客户端编译出错的处理

maven依赖本地非repository中的jar包 http://www.cnblogs.com/piaolingxue/archive/2011/10/12/2208871.html 博客分类: MAVEN 今天在使用maven编译打包一个web应用的时候,碰到一个问题: 项目在开发是引入了依赖jar包,放在了WEB-INF/lib目录下,并通过buildpath中将web libariary导入. 在eclipse中开发没有问题,但是使用maven编译插件开始便宜总是报找不到WEB-INF

OJDBC版本区别 [ojdbc14.jar,ojdbc5.jar和ojdbc6.jar的区别]

http://blog.163.com/[email protected]/blog/static/1820473820123206189381/ OJDBC版本区别 [ojdbc14.jar,ojdbc5.jar和ojdbc6.jar的区别] 2012-04-20 18:18:09|  分类: java参考资料|举报|字号 订阅 下载LOFTER我的照片书  | 在使用Oracle JDBC驱动时,有些问题你是不是通过替换不同版本的Oracle  JDBC驱动来解决的?最常使用的ojdbc14

Caused by: java.lang.IllegalStateException: Detected both log4j-over-slf4j.jar AND slf4j-log4j12.jar on the class path, preempting StackOverflowError

SLF4J: Detected both log4j-over-slf4j.jar AND slf4j-log4j12.jar on the class path, preempting StackOverflowError. SLF4J: See also http://www.slf4j.org/codes.html#log4jDelegationLoop for more details.Exception in thread "main" java.lang.Exception

安装java之后,找不到tools.jar 和dt.jar

可能很多初学者和我一样,在初次接触java开发的过程中,急于看到最终的结果,匆匆在网上下载了jdk之后,点击安装,结果等安装完,开始配置classpath时,发现jdk/lib下面根本就没有 tools.jar 和dt.jar 这两个包.作者在首次遇到这样的问题时,以为是下载的包有问题,于是重新下载了之后再安装,结果还是老样子.我相信你现在很可能遇到了类似的问题.好吧,那你就接着往下看,耐心一点. 问题的根本原因,可能是你和我一样,没有弄清两个概念:JDK和JRE.JDK是java开发核心组件,