一、ScheduleJob实体类介绍

  

public class ScheduleJob implements Serializable
{
  public static String STATUS_RUNNING = "1";
  public static final String STATUS_NOT_RUNNING = "0";
  public static final String CONCURRENT_IS = "1";
  public static final String CONCURRENT_NOT = "0";

  /**
  * 自己定义的组名与类名
  */
  public static final String EXAM_NAME = "EXAM_NAME";
  public static final String EXAM_GROUP = "EXAM_GROUP";

  private Long jobId;
  private Date createTime;
  private Date endTime;
  private Date updateTime;
  /**
  * 任务名称 必须
  */
  private String jobName;
  /**
  * 任务分组 必须
  */
  private String jobGroup;
  /**
  * 任务状态 是否启动任务
  */
  private String jobStatus;
  /**
  * cron表达式 必须
  */
  private String cronExpression;
  /**
  * 描述
  */
  private String description;
  /**
  * 任务执行时调用哪个类的方法 包名+类名
  */
  private String beanClass;
  /**
  * 任务是否有状态
  */
  private String isConcurrent;
  /**
  * spring bean 指定springId方式可不指定beanClass
  */
  private String springId;
  /**
  * 任务调用的方法名 
  */
  private String methodName;

}

二、简单的demo

  //在线考试动态任务实例
  ScheduleJob scheduleJob = new ScheduleJob();
  scheduleJob.setJobId(1L);
  scheduleJob.setJobName(QuartzManager.getExamName());
  scheduleJob.setJobGroup(QuartzManager.getExamGroup());
  scheduleJob.setJobStatus(ScheduleJob.STATUS_RUNNING);

  //设定定时器调用的方法路径,一般调用Service中的方法 此实例调用answerResultService中的updateTimer方法
  scheduleJob.setSpringId("answerResultService");
  scheduleJob.setMethodName("updateTimer");
  scheduleJob.setIsConcurrent(ScheduleJob.CONCURRENT_IS);
  scheduleJob.setCreateTime(new Date());
  int limittime = examina.getLimittime();
  Date endTime = DateUtils.getAboutSecond(scheduleJob.getCreateTime(),limittime);
  scheduleJob.setEndTime(endTime);
  /**
  * 参数设置非必须,视定时器调用的函数是否需要传参而定,Object数组传参适用于各种类型的参数
  */

  HashMap map = new HashMap();
  Class[] cArg = new Class[]{String.class}; 
  Object[] objects = new Object[]{answerResult.getId()};
  map.put("clazz", cArg);
  map.put("values", objects);

  quartzManager.addTriggerJob(scheduleJob,map);

三、动态管理定时器

  /**
  * 添加一个定时器
  * @param job
  * @param map
  * @throws SchedulerException
  */

  public void addTriggerJob(ScheduleJob job,Map map) throws SchedulerException
  {
    if (job == null || !ScheduleJob.STATUS_RUNNING.equals(job.getJobStatus()))
    {
      return;
    }
    Scheduler scheduler = SpringUtils.getBean(SchedulerFactoryBean.class).getScheduler();
    TriggerKey triggerKey = TriggerKey.triggerKey(job.getJobName(),job.getJobGroup());
    //此定时器于创建日期立即执行,在规定时间结束,期间1s执行一次
    SimpleTrigger simpleTrigger =

      (SimpleTrigger) TriggerBuilder.newTrigger().

      withIdentity(job.getJobName(),job.getJobGroup()).

      startAt(job.getCreateTime()).endAt(job.getEndTime()).

      withSchedule(SimpleScheduleBuilder.simpleSchedule().

      withIntervalInSeconds(1).repeatForever()).build();

    //此定时器在规定时间执行,切执行一次

    //SimpleTrigger simpleTrigger =

      (SimpleTrigger) TriggerBuilder.newTrigger().

      withIdentity(job.getJobName(), job.getJobGroup()).

      startAt(startTime).build();

    //此定时器在规定时间执行,期间以规定的时间间隔执行一次或数次,无结束日期,在定时任务删除时结束

    //SimpleTrigger simpleTrigger =

      (SimpleTrigger)TriggerBuilder.newTrigger().

      withIdentity(job.getJobName(),job.getJobGroup()).

      startAt(startTime).

      withSchedule(SimpleScheduleBuilder.simpleSchedule() .

      withIntervalInHours(space).repeatForever()).build();

    Class clazz = ScheduleJob.CONCURRENT_IS.equals(job.getIsConcurrent())

    ? QuartzJobFactory.class: QuartzJobFactoryDisallowConcurrentExecution.class;
    JobDetail jobDetail = JobBuilder.newJob(clazz).withIdentity(job.getJobName(),

    job.getJobGroup()).build();

    jobDetail.getJobDataMap().put("scheduleJob", job);
    jobDetail.getJobDataMap().put("map", map);
    Date date = scheduler.scheduleJob(jobDetail,simpleTrigger );
    System.out.println(jobDetail.getKey() + " will run at: " + date + " and repeat: "+ simpleTrigger.getRepeatCount()

    + " times, every " + simpleTrigger.getRepeatInterval() / 1000L + " seconds");
  }

  /**
  * 获取所有计划中的任务列表
  * 
  * @return
  * @throws SchedulerException
  */
  public List<ScheduleJob> getAllJob() throws SchedulerException
  {
    Scheduler scheduler = SpringUtils.getBean(SchedulerFactoryBean.class).getScheduler();
    GroupMatcher<JobKey> matcher = GroupMatcher.anyJobGroup();
    Set<JobKey> jobKeys = scheduler.getJobKeys(matcher);
    List<ScheduleJob> jobList = new ArrayList<ScheduleJob>();
    for (JobKey jobKey : jobKeys)
    {
      List<? extends Trigger> triggers = scheduler
      .getTriggersOfJob(jobKey);
      for (Trigger trigger : triggers)
      {
        ScheduleJob job = new ScheduleJob();
        job.setJobName(jobKey.getName());
        job.setJobGroup(jobKey.getGroup());
        job.setDescription("触发器:" + trigger.getKey());
        Trigger.TriggerState triggerState = scheduler
        .getTriggerState(trigger.getKey());
        job.setJobStatus(triggerState.name());
        if (trigger instanceof CronTrigger)
        {
          CronTrigger cronTrigger = (CronTrigger) trigger;
          String cronExpression = cronTrigger.getCronExpression();
          job.setCronExpression(cronExpression);
        }
        jobList.add(job);
      }
    }
    return jobList;
  } 

  /**
  * 所有正在运行的job
  * 
  * @return
  * @throws SchedulerException
  */
  public List<ScheduleJob> getRunningJob() throws SchedulerException
  {
    Scheduler scheduler = SpringUtils.getBean(SchedulerFactoryBean.class).getScheduler();
    List<JobExecutionContext> executingJobs = scheduler
    .getCurrentlyExecutingJobs();
    List<ScheduleJob> jobList = new ArrayList<ScheduleJob>(
    executingJobs.size());
    for (JobExecutionContext executingJob : executingJobs)
    {
      ScheduleJob job = new ScheduleJob();
      JobDetail jobDetail = executingJob.getJobDetail();
      JobKey jobKey = jobDetail.getKey();
      Trigger trigger = executingJob.getTrigger();
      job.setJobName(jobKey.getName());
      job.setJobGroup(jobKey.getGroup());
      job.setDescription("触发器:" + trigger.getKey());
      Trigger.TriggerState triggerState = scheduler
      .getTriggerState(trigger.getKey());
      job.setJobStatus(triggerState.name());
      if (trigger instanceof CronTrigger)
      {
        CronTrigger cronTrigger = (CronTrigger) trigger;
        String cronExpression = cronTrigger.getCronExpression();
        job.setCronExpression(cronExpression);
      }
      jobList.add(job);
    }
    return jobList;
  }

  /**
  * 暂停一个job
  * 
  * @param scheduleJob
  * @throws SchedulerException
  */
  public void pauseJob(ScheduleJob scheduleJob) throws SchedulerException
  {
    Scheduler scheduler = SpringUtils.getBean(SchedulerFactoryBean.class).getScheduler();
    JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(),scheduleJob.getJobGroup());
    scheduler.pauseJob(jobKey);
  }

  /**
  * 恢复一个job
  * 
  * @param scheduleJob
  * @throws SchedulerException
  */
  public void resumeJob(ScheduleJob scheduleJob) throws SchedulerException
  {
    Scheduler scheduler = SpringUtils.getBean(SchedulerFactoryBean.class).getScheduler();
    JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(),scheduleJob.getJobGroup());
    scheduler.resumeJob(jobKey);
  }

  /**
  * 删除一个job
  * 
  * @param scheduleJob
  * @throws SchedulerException
  */
  public void deleteJob(String jobName, String jobGroup) throws SchedulerException
  {
    Scheduler scheduler = SpringUtils.getBean(SchedulerFactoryBean.class).getScheduler();
    JobKey jobKey = JobKey.jobKey(jobName,
    jobGroup);
    scheduler.deleteJob(jobKey);
  }

  /**
  * 立即执行job
  * 
  * @param scheduleJob
  * @throws SchedulerException
  */
  public void runAJobNow(ScheduleJob scheduleJob) throws SchedulerException
  {
    Scheduler scheduler = SpringUtils.getBean(SchedulerFactoryBean.class).getScheduler();
    JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(),
    scheduleJob.getJobGroup());
    scheduler.triggerJob(jobKey);
  }

四、定时器执行流程

  

  /**
  * 计划任务执行处 无状态 并发执行
  * @author zdw
  * 有状态,添加@DisallowConcurrentExecution注解进行取消并发
  */
  public class QuartzJobFactory implements Job
  {

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException
    {
      ScheduleJob scheduleJob = (ScheduleJob) context.getMergedJobDataMap().get("scheduleJob");
      TaskUtils.invokMethod(scheduleJob,context); 
    }
  }

  /** 
  * 通过反射调用scheduleJob中定义的方法 
  * 
  * @param scheduleJob 
  */

  public static void invokMethod(ScheduleJob scheduleJob,JobExecutionContext context) { 
    Object object = null; 
    Class clazz = null; 
    //springId不为空先按springId查找bean
    if (StringUtils.isNotEmpty(scheduleJob.getSpringId())) { 
      object = SpringUtils.getBean(scheduleJob.getSpringId());
    } else if (StringUtils.isNotEmpty(scheduleJob.getBeanClass())) { 
      try { 
        clazz = Class.forName(scheduleJob.getBeanClass()); 
        object = clazz.newInstance(); 
      } catch (Exception e) { 
        e.printStackTrace(); 
      }

    } 
    if (object == null) {
      log.error("任务名称 = [" + scheduleJob.getJobName() + "]---------------未启动成功,请检查是否配置正确!!!"); 
      return; 
    } 
    clazz = object.getClass(); 
    Method method = null; 
    JobDataMap jdm = context.getMergedJobDataMap();
    HashMap map = (HashMap) jdm.get("map");
    if(map != null || map.size() != 0){
    Class[] cArg = (Class[]) map.get("clazz");
    Object[] values = (Object[]) map.get("values");
    try {
      method = clazz.getDeclaredMethod(scheduleJob.getMethodName(),cArg); 
    } catch (NoSuchMethodException e) { 
      log.error("任务名称 = [" + scheduleJob.getJobName() + "]---------------未启动成功,方法名设置错误!!!"); 
    } catch (SecurityException e) { 
      e.printStackTrace(); 
    } 
    if (method != null) { 
      try { 
        method.invoke(object,values); 
      } catch (IllegalAccessException e) { 
        e.printStackTrace(); 
      } catch (IllegalArgumentException e) { 
        e.printStackTrace(); 
      } catch (InvocationTargetException e) { 
        e.printStackTrace(); 
      } 
    }
  } else{
    try {
      method = clazz.getDeclaredMethod(scheduleJob.getMethodName()); 
    } catch (NoSuchMethodException e) { 
      log.error("任务名称 = [" + scheduleJob.getJobName() + "]---------------未启动成功,方法名设置错误!!!"); 
    } catch (SecurityException e) { 
      e.printStackTrace(); 
    } 
    if (method != null) { 
      try { 
        method.invoke(object); 
      } catch (IllegalAccessException e) { 
        e.printStackTrace(); 
      } catch (IllegalArgumentException e) { 
        e.printStackTrace(); 
      } catch (InvocationTargetException e) { 
        e.printStackTrace(); 
        } 
      }
    }
  }

五、配置相关

pom.xml

<!-- quartz -->
  <dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.2.2</version>
  </dependency>
  <dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz-jobs</artifactId>
    <version>2.2.2</version>
  </dependency>

applicationContext-quartz-cron-local.xml

   <description>Quartz的本地Cron式执行任务配置</description>
    <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" >
   <!-- Job接受applicationContext的成员变量名 -->
    <property name="applicationContextSchedulerContextKey" value="applicationContext" />
    </bean>

applicationContext-quartz-timer-cluster.xml

  <description>Quartz的定时集群任务配置</description>

  <!-- Quartz集群Schduler -->
    <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" >
  <!-- Triggers集成 -->
    <property name="triggers">
  <list>
  </list>
  </property>
  <!-- quartz配置文件路径, 指向cluster配置 -->
    <property name="configLocation" value="classpath:schedule/quartz-cluster.properties" />
  <!-- 启动时延期2秒开始任务 -->
    <property name="startupDelay" value="30" />
  <!-- 保存Job数据到数据库所需的数据源 -->
    <property name="dataSource" ref="quartzDataSource" /> 
  <!-- Job接受applicationContext的成员变量名 -->
    <property name="applicationContextSchedulerContextKey" value="applicationContext" />
  </bean>
  <!-- Job的可配置属性,在job中通过applicationContext动态获取 -->
  <util:map id="timerJobConfig">
    <entry key="nodeName" value="${server.node_name}" />
  </util:map>

JAVA动态任务SCHEDULEJOB相关推荐

  1. java动态代理【一】

    java动态代理的定义:为其他目标类的方法增加切面的逻辑,即在执行目标类方法的时候,先去执行一段如校验检测的逻辑代码.java通俗一点就是生成一个继承目标类的子类,并在每个调用方法都添加一段逻辑. 应 ...

  2. AspectJ和Spring AOP(java动态代理和CGLIB)简单介绍

    1.AOP介绍 什么是AOP:AOP就是面向切面编程.使用的背景: 1)我们的振隆维护着一千个方法,一天老板让振隆把这一千个方法都要加上事务代码(统一代码) 2)振隆咬咬牙,添加了一个新的方法,然后让 ...

  3. Java 动态语言

    Java  动态语言 XRuby 官方网站: http://code.google.com/p/xruby/ 2009-05-24 JBasic 官方网站: http://jbasic.sourcef ...

  4. Java动态代理的实现

    动态代理作为代理模式的一种扩展形式,广泛应用于框架(尤其是基于AOP的框架)的设计与开发,本文将通过实例来讲解Java动态代理的实现过程. 友情提示:本文略有难度,读者需具备代理模式相关基础知识,. ...

  5. Java动态代理与Cglib代理

    为什么80%的码农都做不了架构师?>>>    最近又继续回来死磕Spring源码,以前看的也忘得差不多了,这次先把Spring使用的动态代理cglib看了一下,打好基础知识. cg ...

  6. JAVA 动态代理学习记录

    打算用JAVA实现一个简单的RPC框架,看完RPC参考代码之后,感觉RPC的实现主要用到了两个方面的JAVA知识:网络通信和动态代理.因此,先补补动态代理的知识.---多看看代码中写的注释 参考:Ja ...

  7. 初看Mybatis 源码 (二) Java动态代理类

    先抛出一个问题,用过Mybatis的都知道,我们只需要定义一个Dao的接口,在里面写上一些CRUD相关操作,然后配置一下sql映射文件,就可以达到调用接口中的方法,然后执行sql语句的效果,为什么呢? ...

  8. Java初学者如何迈出AOP第一步--使用Java 动态代理实现AOP

    Java初学者如何迈出AOP第一步--使用Java 动态代理实现AOP xBird 原创  (参与分:36,专家分:90)   发表:2004-9-3 上午9:37   版本:1.0   阅读:160 ...

  9. Java动态生成类以及动态添加属性 本篇文章来源于 Linux公社网站(www.linuxidc.c

    2019独角兽企业重金招聘Python工程师标准>>> 有个技术实现需求:动态生成类,其中类中的属性来自参数对象中的全部属性以及来自参数对象propertities文件. 那么技术实 ...

最新文章

  1. 我们究竟应不应该使用框架?
  2. 2018-06-02笔记
  3. JS选中OPTION
  4. Retrofit2.0和Rxjava结合使用的简单记录
  5. 如何提取SAP UI5应用的技术信息
  6. 如何在matlab里输入复杂公式_在MATLAB作图中输出漂亮的公式
  7. Python正则表达式re.sub使用
  8. w10电脑c盘满了怎么清理_Win10专业版电脑c盘满了怎么清理?教你一招快速清理C盘...
  9. LA 6047 Perfect Matching 字符串哈希
  10. 【个人网站搭建教程】阿里云服务器+宝塔+wordpress
  11. 网络架构设计:CNN based和Transformer based
  12. hdu 2037 这个夏天不AC (java)
  13. 在Mind+下使用Easy loT实现mqtt消息消息的通讯
  14. Oracle实现网吧计费系统,毕业设计(论文)-网吧计费管理系统设计.doc
  15. 大一python选择题题库及答案_python选择题库
  16. 微信营销与微博营销的区别
  17. 什么是实体关系图(ERD)?
  18. lingo纳什均衡代码_传统的战略式博弈求解纳什均衡方法——虚拟博弈(Fictitious Play)讲解及其代码...
  19. java框架-Springmvc-quzrtz-jasperreport-pio-pdfbox-jedis
  20. P1930 亚瑟王的宫殿

热门文章

  1. Android Studio 用USB连接到真机调试方法
  2. Seo:秒排建站(三)主机推荐补充讲解
  3. MFC DockPane 分割窗口 嵌入对话框
  4. 百度地图API 实现地图多点标注
  5. 2018VR一体机VR眼镜哪个牌子好?大家都选了UGP VR眼镜,UGP VR一体机
  6. PyQt5之进度条:QProgressBar
  7. SpringBoot Mybatis多数据源配置
  8. itextpdf 添加折线图、饼图、柱状图
  9. R语言多项式线性模型:最大似然估计二次曲线
  10. Android初学习