org.quartz.Job(基于OpenSymphony开源组织在Job scheduling领域的开源项目)

1.介绍(感觉Spring框架Quartz也是基于这个封装的)

     Quartz是OpenSymphony开源组织在Job scheduling领域一个开源项目,

     它可以与J2EE与J2SE应用程序相结合也可以单独使用。

     Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的日程序表。

     Jobs可以做成标准的Java组件或 EJBs。

 

2.简单的实现

    第一步:

           引包:log4j-1.2.16,quartz-2.1.7,slf4j-api-1.6.1.jar,slf4j-log4j12-1.6.1.jar

            注:这些包都在下载的Quartz包里面包含着,因此没有必要为寻找这几个包而头疼。

     第二步:

           创建要被定执行的任务类:

           创建一个实现了org.quartz.Job接口的类,并实现这个接口的唯一

           一个方法execute(JobExecutionContext arg0) throws JobExecutionException

          实例:

               import java.text.SimpleDateFormat;

               import java.util.Date;

               import org.quartz.Job;

               import org.quartz.JobExecutionContext;

               import org.quartz.JobExecutionException;

              public class myJob implements Job {

                       @Override

                        public void execute(JobExecutionContext arg0)

                            throws JobExecutionException {

                               SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");

                               System.out.println(sdf.format(new Date()));

                          }

          }

   第三步:创建任务调度,并执行

           import java.text.SimpleDateFormat;

           import java.util.Date;

           import org.quartz.CronTrigger;

           import org.quartz.JobDetail;

           import org.quartz.Scheduler;

           import org.quartz.SchedulerFactory;

           import org.quartz.impl.StdSchedulerFactory;

           public class Test {

                   public void go() throws Exception {

                      // 首先,必需要取得一个Scheduler的引用

                      SchedulerFactory sf = new StdSchedulerFactory();

                      Scheduler sched = sf.getScheduler();

                      String time="0 51 11 ? * *";

                      // jobs可以在scheduled的sched.start()方法前被调用

                      // job 1将每隔20秒执行一次

                      JobDetail job = new JobDetail("job1", "group1", myJob.class);

                      CronTrigger trigger = new CronTrigger("trigger1", "group1");

                      trigger.setCronExpression(time);

                      Date ft = sched.scheduleJob(job, trigger);

                      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");

                      System.out.println(job.getKey() + " 已被安排执行于: " + sdf.format(ft) + ",

                                       并且以如下重复规则重复执行: " + trigger.getCronExpression());

                      // job 2将每2分钟执行一次(在该分钟的第15秒)

                      job = new JobDetail("job2", "group1",myJob.class);

                      trigger = new CronTrigger("trigger2", "group1");

                       trigger.setCronExpression(time);

                       ft = sched.scheduleJob(job, trigger);

                       System.out.println(job.getKey() + " 已被安排执行于: " + sdf.format(ft) + ",

                                       并且以如下重复规则重复执行: " + trigger.getCronExpression());

                       // 开始执行,start()方法被调用后,计时器就开始工作,计时调度中允许放入N个Job

                       sched.start();

                       try {

                             // 主线程等待一分钟

                             Thread.sleep(60L * 1000L);

                       } catch (Exception e) {

                       }

                      // 关闭定时调度,定时器不再工作

                      sched.shutdown(true);

                 }

               public static void main(String[] args) throws Exception {

                        Test test = new Test();

                         test.go();

               }

        }

 

 

2.封装一个Job管理器

    import java.text.ParseException; 

    import org.quartz.CronTrigger;

    import org.quartz.JobDetail;

    import org.quartz.Scheduler;

    import org.quartz.SchedulerException;

    import org.quartz.SchedulerFactory;

    import org.quartz.impl.StdSchedulerFactory;

    //定时任务管理类

     public class QuartzManager { 

           private static SchedulerFactory gSchedulerFactory = new StdSchedulerFactory(); 

           private static String JOB_GROUP_NAME = "EXTJWEB_JOBGROUP_NAME"; 

           private static String TRIGGER_GROUP_NAME = "EXTJWEB_TRIGGERGROUP_NAME";

           //添加一个定时任务,使用默认的任务组名,触发器名,触发器组名

           //@param jobName 任务名

           //@param jobClass   任务

           //@param time  时间设置,参考quartz说明文档

           //@throws SchedulerException

           //@throws ParseException

           public static void addJob(String jobName, String jobClass, String time) {

                     try { 

                           Scheduler sched = gSchedulerFactory.getScheduler();

                           // 任务名,任务组,任务执行类      

                           JobDetail jobDetail = new JobDetail(jobName, JOB_GROUP_NAME, Class.forName(jobClass));

                           // 触发器

                           // 触发器名,触发器组 

                           CronTrigger trigger = new CronTrigger(jobName, TRIGGER_GROUP_NAME);

                            trigger.setCronExpression(time);// 触发器时间设定

                            sched.scheduleJob(jobDetail, trigger);

                            // 启动

                            if (!sched.isShutdown()){

                                  sched.start();

                             }

                        } catch (Exception e) { 

                            e.printStackTrace(); 

                            throw new RuntimeException(e);

                        }

                 }

                

              //@param jobName 任务名

              //@param jobGroupName 任务组名

              //@param triggerName  触发器名

              //@param triggerGroupName 触发器组名

              //@param jobClass   任务

              //@param time  时间设置,参考quartz说明文档

              //@throws SchedulerException

              //@throws ParseException

              public static void addJob(String jobName, String jobGroupName,

                         String triggerName, String triggerGroupName, String jobClass, String time){ 

                     try { 

                         Scheduler sched = gSchedulerFactory.getScheduler();

                         // 任务名,任务组,任务执行类

                          JobDetail jobDetail = new JobDetail(jobName, jobGroupName, Class.forName(jobClass));

                          // 触发器

                          // 触发器名,触发器组

                          CronTrigger trigger = new CronTrigger(triggerName, triggerGroupName);

                          trigger.setCronExpression(time);// 触发器时间设定

                          sched.scheduleJob(jobDetail, trigger);

                      } catch (Exception e) {

                           e.printStackTrace(); 

                           throw new RuntimeException(e); 

                      }

                  }

                 //修改一个任务的触发时间(使用默认的任务组名,触发器名,触发器组名)

                 //@param jobName

                 //@param time

                public static void modifyJobTime(String jobName, String time) {

                        try { 

                               Scheduler sched = gSchedulerFactory.getScheduler(); 

                               CronTrigger trigger = (CronTrigger) sched.getTrigger(jobName, TRIGGER_GROUP_NAME); 

                               if(trigger == null) {

                                        return;

                                 }

                                String oldTime = trigger.getCronExpression(); 

                                 if (!oldTime.equalsIgnoreCase(time)) { 

                                           JobDetail jobDetail = sched.getJobDetail(jobName, JOB_GROUP_NAME); 

                                           Class objJobClass = jobDetail.getJobClass();

                                           String jobClass = objJobClass.getName();

                                            removeJob(jobName); 

                                           addJob(jobName, jobClass, time);

                                     }

                              } catch (Exception e) {

                                   e.printStackTrace();

                                   throw new RuntimeException(e);

                               }

                        }

                     //修改一个任务的触发时间

                     //@param triggerName @param triggerGroupName @param time

                     public static void modifyJobTime(String triggerName,

                            String triggerGroupName, String time) {

                           try { 

                                   Scheduler sched = gSchedulerFactory.getScheduler();

                                   CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerName, triggerGroupName); 

                                   if(trigger == null) { 

                                         return; 

                                     }

                                   String oldTime = trigger.getCronExpression();

                                   if (!oldTime.equalsIgnoreCase(time)) {

                                            CronTrigger ct = (CronTrigger) trigger;

                                            // 修改时间

                                            ct.setCronExpression(time);

                                             // 重启触发器

                                             sched.resumeTrigger(triggerName, triggerGroupName);

                                     }

                               } catch (Exception e) {

                                     e.printStackTrace();

                                     throw new RuntimeException(e);

                               }

                        } 

                     //移除一个任务(使用默认的任务组名,触发器名,触发器组名)

                     public static void removeJob(String jobName) {

                                 try {

                                     Scheduler sched = gSchedulerFactory.getScheduler();

                                     sched.pauseTrigger(jobName, TRIGGER_GROUP_NAME);// 停止触发器

                                     sched.unscheduleJob(jobName, TRIGGER_GROUP_NAME);// 移除触发器 

                                     sched.deleteJob(jobName, JOB_GROUP_NAME);// 删除任务 

                                  } catch (Exception e) { 

                                     e.printStackTrace();

                                     throw new RuntimeException(e);

                                  }

                          }

                        //移除一个任务

                        //@param jobName @param jobGroupName

                        //@param triggerName  @param triggerGroupName

                       public static void removeJob(String jobName, String jobGroupName,

                               String triggerName, String triggerGroupName) {

                            try {

                                Scheduler sched = gSchedulerFactory.getScheduler();

                                sched.pauseTrigger(triggerName, triggerGroupName);// 停止触发器

                                sched.unscheduleJob(triggerName, triggerGroupName);// 移除触发器

                                sched.deleteJob(jobName, jobGroupName);// 删除任务

                            } catch (Exception e) {

                                 e.printStackTrace();

                                  throw new RuntimeException(e);

                            }

                      } 

                    //启动所有定时任务

                    public static void startJobs() { 

                             try {

                                    Scheduler sched = gSchedulerFactory.getScheduler();

                                    sched.start();

                              } catch (Exception e) { 

                                     e.printStackTrace();

                                     throw new RuntimeException(e);

                               }

                       }

                      //关闭所有定时任务       

                      public static void shutdownJobs() {

                              try {

                                   Scheduler sched = gSchedulerFactory.getScheduler(); 

                                   if(!sched.isShutdown()) {

                                              sched.shutdown();

                                     } 

                                } catch (Exception e) {

                                     e.printStackTrace(); 

                                     throw new RuntimeException(e); 

                                 }

                            }

               } 

 

 

学习来源:https://blog.csdn.net/xinyuan_java/article/details/51602088

 

      

        

 

    

posted @ 2020-08-28 14:06  小窝蜗  阅读(1556)  评论(0)    收藏  举报