靈活操做Java定時任務

宋現鋒 2018/2/6html

在開發測試平臺的時候,有不少狀況下須要用到定時任務,如接口或是服務的監控,頁面定時掃描,自動化測試用例定時執行等等。一般的作法是利用Jenkins作定時調用,也能夠藉助於Linux的定時任務crontab來設置要執行的任務。先前我使用python開發測試平臺的時候,就是直接操做/var/spool/cron/root進行定時任務的添加,刪除,開啓和暫停的。但是最近用java藉助於公司的SCF+WF框架進行測試平臺的開發的時候,發現存在着問題:前端

1,    直接經過命令行方式執行java文件比較麻煩,由於須要執行的文件要調用不少包。java

2,    而任何對定時任務的操做,如增長和刪除都是比較麻煩的,須要先編譯才能執行。python

因此直接執行java文件的方法行不通,因而去網上搜索java處理定時任務的方法。這一搜仍是挺多的,具體對考文章:http://www.javashuo.com/article/p-fdbhgovy-bs.html,爲了更加靈活地知足動態操做定時任務的須要,我決定使用Quartz。下面我將具體的使用詳細介紹一下:web

一,  添加maven依賴

    將下面的依賴添加到你的maven工程的pom.xml文件中:框架

<dependency>

<groupId>org.quartz-scheduler</groupId>

<artifactId>quartz</artifactId>

<version>2.3.0</version>

</dependency>

  

二,  編寫定時任務操做類

  下面的類中我添加了對定時任務操做的增,刪,改,開啓,中止等操做,代碼中的註釋比較全,很容易讀懂的。maven

package com.bj58.qa.comtestplatform.web.bll.Admonitorbll;

import java.util.List;

import org.quartz.CronScheduleBuilder;

import org.quartz.CronTrigger;

import org.quartz.Job;

import org.quartz.JobBuilder;

import org.quartz.JobDetail;

import org.quartz.JobKey;

import org.quartz.Scheduler;

import org.quartz.SchedulerException;

import org.quartz.SchedulerFactory;

import org.quartz.Trigger;

import org.quartz.TriggerBuilder;

import org.quartz.TriggerKey;

import org.quartz.impl.StdSchedulerFactory;

 

public class CronTabOperationsBll

{

  private static SchedulerFactory schedulerFactory = new StdSchedulerFactory();

 

  /**

   * @Description: 添加一個定時任務

   * 

   * @param jobName 任務名

   * @param jobGroupName  任務組名

   * @param triggerName 觸發器名

   * @param triggerGroupName 觸發器組名

   * @param jobClass  任務

   * @param cron   時間設置,參考quartz說明文檔 

   * @param clid:定時任務ID

   */ 

  public static void addJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName, Class jobClass, String cron, String clid)

  {

    try

    {

      Scheduler sched = schedulerFactory.getScheduler();

     

      JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName).build();

      jobDetail.getJobDataMap().put("clid", clid);

     

      TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();

     

      triggerBuilder.withIdentity(triggerName, triggerGroupName);

      triggerBuilder.startNow();

     

      triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));

     

      CronTrigger trigger = (CronTrigger)triggerBuilder.build();

     

 

      sched.scheduleJob(jobDetail, trigger);

      if (!sched.isShutdown()) {

        sched.start();

      }

    }

    catch (Exception e)

    {

      throw new RuntimeException(e);

    }

  }

 

  /**

   * @Description: 編輯一個定時任務

   * 

   * @param jobName 任務名

   * @param jobGroupName  任務組名

   * @param triggerName 觸發器名

   * @param triggerGroupName 觸發器組名

   * @param cron   時間設置,參考quartz說明文檔 

   * @param clid:定時任務ID

   */ 

  public static void modifyJobTime(String jobName, String jobGroupName, String triggerName, String triggerGroupName, String cron, String clid)

  {

    try

    {

      Scheduler sched = schedulerFactory.getScheduler();

      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, clid);

    }

    catch (Exception e)

    {

      throw new RuntimeException(e);

    }

  }

  /**

   * @Description: 刪除一個定時任務

   * 

   * @param jobName 任務名

   * @param jobGroupName  任務組名

   * @param triggerName 觸發器名

   * @param triggerGroupName 觸發器組名

   */ 

  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);

    }

  }

 

  /**

   * 啓動全部定時任務

   */

  public static void startJobs()

  {

    try

    {

      Scheduler sched = schedulerFactory.getScheduler();

      sched.start();

    }

    catch (Exception e)

    {

      throw new RuntimeException(e);

    }

  }

 

  /**

   *關閉全部定時任務

   */

  public static void shutdownJobs()

  {

    try

    {

      Scheduler sched = schedulerFactory.getScheduler();

      if (!sched.isShutdown()) {

        sched.shutdown();

      }

    }

    catch (Exception e)

    {

      throw new RuntimeException(e);

    }

  }

 

  /**

   * 關閉定時任務

   * @param jobName 任務名

   * @param jobGroupName  任務組名

   */

  public static void ShutDownJob(String jobName, String jobGroupName)

  {

    try

    {

      Scheduler scheduler = schedulerFactory.getScheduler();

      JobKey jobKey = JobKey.jobKey(jobName, jobGroupName);

      scheduler.pauseJob(jobKey);

      System.out.println("關閉定時任務:" + jobName);

    }

    catch (SchedulerException e)

    {

      e.printStackTrace();

    }

  }

  /**

   * 開啓一個定時任務

   * @param jobName 任務名

   * @param jobGroupName  任務組名

   */

  public static void StartJob(String jobName, String jobGroupName)

  {

    try

    {

      Scheduler scheduler = schedulerFactory.getScheduler();

      JobKey jobKey = JobKey.jobKey(jobName, jobGroupName);

      scheduler.resumeJob(jobKey);

      System.out.println("開啓定時任務:" + jobName);

    }

    catch (SchedulerException e)

    {

      e.printStackTrace();

    }

  }

  /**

   * 獲取定時任務中存在的任務

   * @return

   */

  public static String GetAllExcutingJobs()

  {

    String jobslist = "定時任務中存在的JobGroups:";

    try

    {

      Scheduler scheduler = schedulerFactory.getScheduler();

      List<String> jobgroups = scheduler.getJobGroupNames();

      System.out.println("定時任務中存在的Jobs:" + jobgroups.size());

      for (String jbgroup : jobgroups) {

        jobslist = jobslist + "JobGroup:" + jbgroup;

      }

    }

    catch (SchedulerException e)

    {

      e.printStackTrace();

    }

    return jobslist;

  }

 

  /**

   * 獲取定時任務的狀態

   * @param triggerName 觸發器名

   * @param triggerGroupName 觸發器組名

   * @return

   */

  public static String GetJobStatus(String triggerName, String triggerGroupName)

  {

    String jobstatus = "定時任務" + triggerName + "的狀態是:";

    try

    {

      Scheduler scheduler = schedulerFactory.getScheduler();

      TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);

      Trigger.TriggerState state = scheduler.getTriggerState(triggerKey);

      jobstatus = jobstatus + state;

    }

    catch (SchedulerException e)

    {

      e.printStackTrace();

    }

    return jobstatus;

  }

 

  public static void main(String[] args)

  {

    try

    {

      System.out.println("【系統啓動】開始(每1秒輸出一次)...");

      addJob("測試定時任務", "測試分組", "測試觸發器", "測試觸發器分組", CronTabTask.class, "0/1 * * * * ?", "9527");

      addJob("測試定時任務1", "測試分組1", "測試觸發器1", "測試觸發器分組1", CronTabTask.class, "0/2 * * * * ?", "850318");

      System.out.println(GetJobStatus("測試觸發器", "測試觸發器分組"));

     

      Thread.sleep(5000L);

      ShutDownJob("測試定時任務1", "測試分組1");

      System.out.println(GetJobStatus("測試觸發器1", "測試觸發器分組1"));

    }

    catch (Exception e)

    {

      e.printStackTrace();

    }

  }

}

  

   將這個類添加到公用包中,在須要操做定時任務的地方進行靈活調用,便可完成你的需求。注意說明的一點是:個人定時任務比較複雜,須要藉助於」clid」來執行後續操做,因此在添加的時候須要傳參數來給定時任務。傳參數的語句以下:測試

jobDetail.getJobDataMap().put("clid", clid);ui

三,  定時任務執行類

   經過編寫下面的類來執行具體的定時任務:spa

package com.bj58.qa.comtestplatform.web.bll.Admonitorbll;

 

import com.bj58.ershou.common.helper.LoggerHelper;

import java.io.PrintStream;

import java.util.Date;

import org.quartz.Job;

import org.quartz.JobDataMap;

import org.quartz.JobDetail;

import org.quartz.JobExecutionContext;

import org.quartz.JobExecutionException;

 

public class CronTabTask implements Job

{

  private static LoggerHelper loggerHelper = new LoggerHelper(CronTabTask.class);

  /**

   * 執行監控任務的定時任務

   */

  public void execute(JobExecutionContext jobExecutionContext)

    throws JobExecutionException

  {

    String clid = jobExecutionContext.getJobDetail().getJobDataMap().getString("clid");

    AdMonitorCronTab amct = new AdMonitorCronTab();

    amct.AdMonitorTask(clid);

    System.out.println(new Date() + ": 執行廣告監控任務,任務ID:" + clid);

  }

}

  

而這個類中的AdMonitorCronTab纔是我具體須要監控的內容,經過調用AdMonitorTask(clid)來執行具體的操做。由於涉及具體的業務,就不在此粘貼代碼了。

四,  總結

    在具體的開發工做中,經過在網上查找相應的文章,加上本身的調試總結。充分證實上面代碼是的效可用的,藉助於前端用戶交互效果,能很好地完成對定時任務的靈活操做,在此將相關的內容總結一下,但願對有須要的同窗一點兒提示。

相關文章
相關標籤/搜索