发表于: 2018-03-12 20:45:43

1 444


今日完成

1.动态定时任务的实现

(1)定义任务,就是需要做的事情

public class MyJob implements Job {
@Override
   public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println(new Date() + ":do something...........就是他 ");
   }
}

定义任务管理类

public class QuartzManager {

private static SchedulerFactory schedulerFactory = new StdSchedulerFactory();
   
   /**
    * @param jobName          任务名
    * @param jobGroupName     任务组名
    * @param triggerName      触发器名
    * @param triggerGroupName 触发器组名
    * @param jobClass         任务
    * @param cron             时间设置,参考quartz说明文档
    * @Description: 添加一个定时任务
    */
   public static void addJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName, Class jobClass, String cron) {

try {
Scheduler scheduler = schedulerFactory.getScheduler();
           JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName).build();
           TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
           // 触发器名,触发器组
           triggerBuilder.withIdentity(triggerName, triggerGroupName);
           triggerBuilder.startNow();
           // 触发器时间设定
           triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));
           // 创建Trigger对象
           CronTrigger trigger = (CronTrigger) triggerBuilder.build();
           
           // 调度容器设置JobDetailTrigger
           scheduler.scheduleJob(jobDetail, trigger);
           
           // 启动
           if (!scheduler.isShutdown()) {
scheduler.start();
           }
} catch (SchedulerException e) {
e.printStackTrace();
       }

}

/**
    * @param jobName
    * @param jobGroupName
    * @param triggerName      触发器名
    * @param triggerGroupName 触发器组名
    * @param cron             时间设置,参考quartz说明文档
    * @Description: 修改一个任务的触发时间
    */
   public static void modifyJobTime(String jobName, String jobGroupName, String triggerName, String triggerGroupName, String cron) {
try {

Scheduler sched = schedulerFactory.getScheduler();
           TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);
           CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerKey);
           if (trigger == null) {
return;
           }

String oldTime = trigger.getCronExpression();
           if (!oldTime.equalsIgnoreCase(cron)) {
/** 方式一 :调用 rescheduleJob 开始 */
               // 触发器
               TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
               // 触发器名,触发器组
               triggerBuilder.withIdentity(triggerName, triggerGroupName);
               triggerBuilder.startNow();
               // 触发器时间设定
               triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));
               // 创建Trigger对象
               trigger = (CronTrigger) triggerBuilder.build();
               // 方式一 :修改一个任务的触发时间
               sched.rescheduleJob(triggerKey, trigger);
               /** 方式一 :调用 rescheduleJob 结束 */
               
               /** 方式二:先删除,然后在创建一个新的Job  */
               //JobDetail jobDetail = sched.getJobDetail(JobKey.jobKey(jobName, jobGroupName));
               //Class<? extends Job> jobClass = jobDetail.getJobClass();
               //removeJob(jobName, jobGroupName, triggerName, triggerGroupName);
               //addJob(jobName, jobGroupName, triggerName, triggerGroupName, jobClass, cron);
               /** 方式二 :先删除,然后在创建一个新的Job */
           }
} catch (Exception e) {
throw new RuntimeException(e);
       }
}


/**
    * @param jobName
    * @param jobGroupName
    * @param triggerName
    * @param triggerGroupName
    * @Description: 移除一个任务
    */
   public static void removeJob(String jobName, String jobGroupName,
                                String triggerName, String triggerGroupName) {
try {
Scheduler sched = schedulerFactory.getScheduler();
           
           TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);
           // 停止触发器
           sched.pauseTrigger(triggerKey);
           // 移除触发器
           sched.unscheduleJob(triggerKey);
           // 删除任务
           sched.deleteJob(JobKey.jobKey(jobName, jobGroupName));
       } catch (Exception e) {
throw new RuntimeException(e);
       }

}

/**
    * @Description:启动所有定时任务
    */
   public static void startJobs() {
try {
Scheduler sched = schedulerFactory.getScheduler();
           sched.start();
       } catch (Exception e) {
throw new RuntimeException(e);
       }
}

/**
    * @Description:关闭所有定时任务
    */
   public static void shutdownJobs() {
try {
Scheduler sched = schedulerFactory.getScheduler();
           if (!sched.isShutdown()) {
sched.shutdown();
           }
} catch (Exception e) {
throw new RuntimeException(e);
       }
}

}

测试定时任务

public class Test {
public static String JOB_NAME = "动态任务调度";
   public static String TRIGGER_NAME = "动态任务触发器";
   public static String JOB_GROUP_NAME = "XLXXCC_JOB_GROUP";
   public static String TRIGGER_GROUP_NAME = "XLXXCC_JOB_GROUP";
   
   public static void main(String[] args) {
try {
System.out.println("【系统启动】开始(1秒输出一次)...");
           QuartzManager.addJob(JOB_NAME, JOB_GROUP_NAME, TRIGGER_NAME, TRIGGER_GROUP_NAME, MyJob.class, "0/1 * * * * ?");
           
           Thread.sleep(5000);
           System.out.println("【修改时间】开始(5秒输出一次)...");
           QuartzManager.modifyJobTime(JOB_NAME, JOB_GROUP_NAME, TRIGGER_NAME, TRIGGER_GROUP_NAME, "0/5 * * * * ?");
           
           Thread.sleep(6000);
           System.out.println("//移除定时】开始...");
           QuartzManager.removeJob(JOB_NAME, JOB_GROUP_NAME, TRIGGER_NAME, TRIGGER_GROUP_NAME);
           System.out.println("【移除定时】成功");
       } catch (Exception e) {
e.printStackTrace();
       }
}

}

2.下午完成了方案的评审。

里面的一些类的功能

  • 1、org.quartz.Job 
    它是一个抽象接口,表示一个工作,也就是我们要执行的具体内容,他只定义了一个几口方法: 
    void execute(JobExecutionContext context) 
    作用等同Spring的: 
    org.springframework.scheduling.quartz.QuartzJobBean
  • 2、org.quartz.JobDetail 
    JobDetail表示一个具体的可执行的调度程序,Job是这个可执行程调度程序所要执行的内容,它包含了这个任务调度的方案和策略。 
    他的实现类: 
    org.quartz.impl.JobDetailImpl 
    作用等同Spring: 
    org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean
  • 3、org.quartz.Trigger 
    它是一个抽象接口,表示一个调度参数的配置,通过配置它,来告诉调度容器什么时候去调用JobDetail。 
    他的两个实现类: 
    org.quartz.impl.triggers.SimpleTriggerImpl 
    org.quartz.impl.triggers.CronTriggerImpl 
    等同于Spring的: 
    org.springframework.scheduling.quartz.SimpleTriggerBean 
    org.springframework.scheduling.quartz.CronTriggerBean 
    前者只支持按照一定频度调用任务,如每隔30分钟运行一次。 
    后者既支持按照一定频度调用任务,又支持定时任务。
  • 4、org.quartz.Scheduler 
    代表一个调度容器,一个调度容器中可以注册多个JobDetail和Trigger。当Trigger与JobDetail组合,就可以被Scheduler容器调度了。它的方法有start()、shutdown()等方法,负责管理整个调度作业。 
    等同Spring的: org.springframework.scheduling.quartz.SchedulerFactoryBean

遇到问题

1.动态定时任务的完成

明日计划

1.开始分工,开始拆禅道。

2.开始写接口了。

收获

1.定时任务的了解。


返回列表 返回列表
评论

    分享到