1. 程式人生 > >定時操作,公司裡叫定時任務排程,我用Quartz(一)

定時操作,公司裡叫定時任務排程,我用Quartz(一)

由於剛開始寫部落格,很多使用技巧都不熟悉,所以歡迎大家多多指正,我將會不斷的完善寫過的文章,包括程式碼的優化和圖片的重新選擇。
最近在公司被讓做一個,定時自動檢測多臺遠端伺服器資料庫的功能,今天我把我找到的解決方式記錄在這裡,由於一次無法寫完,我先把定時任務實現的操作記錄在這裡。
   QuartzManager.addJobManager("郵件檢查定時器", QuartzCheckDatabaseMail.class, "0 44 15 * * ? *"); 
這個定時任務的核心程式碼其實就這一句,關鍵是QuartzManager這個類的由來。我使用了Quartz開源框架。
第一要點:一定要匯入 **quartz-all-1.6.0.jar**  這個jar包
package com.msun.scheduleServer.timerTask;

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"; @SuppressWarnings("unused") public static void
addJob(String jobName,Class cls,String time,String workFlowId,String timerTaskId){ try { Scheduler sched= gSchedulerFactory.getScheduler(); JobDetail jobDetail =new JobDetail(jobName, JOB_GROUP_NAME, cls);// 任務名,任務組,任務執行類 jobDetail.getJobDataMap().put("workFlowId", workFlowId); jobDetail.getJobDataMap().put("timerTaskId", timerTaskId); // 觸發器 CronTrigger trigger = new CronTrigger(jobName, TRIGGER_GROUP_NAME);// 任務名,觸發時間 // 觸發器時間設定 trigger.setCronExpression(time); //新增定時任務 sched.scheduleJob(jobDetail, trigger); if(!sched.isShutdown()){ sched.start(); } } catch (SchedulerException e) { throw new RuntimeException(e); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } } 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) { throw new RuntimeException(e); } System.out.println("刪除定時任務:"+jobName); } public static void modifyJobTime(String jobName, String time,String workFlowId, String timerTaskId) { 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(); removeJob(jobName); addJob(jobName, objJobClass, time,workFlowId, timerTaskId); } } catch (Exception e) { throw new RuntimeException(e); } } public static void addJobManager(String jobName,Class cls,String time){ try { Scheduler sched= gSchedulerFactory.getScheduler(); JobDetail jobDetail =new JobDetail(jobName, JOB_GROUP_NAME, cls);// 任務名,任務組,任務執行類 // 觸發器 CronTrigger trigger = new CronTrigger(jobName, TRIGGER_GROUP_NAME);// 任務名,觸發時間 // 觸發器時間設定 trigger.setCronExpression(time); //新增定時任務 sched.scheduleJob(jobDetail, trigger); if(!sched.isShutdown()){ sched.start(); } } catch (SchedulerException e) { throw new RuntimeException(e); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void startJobs(){ Scheduler sched; try { sched = gSchedulerFactory.getScheduler(); sched.start(); } catch (SchedulerException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }

分割點:jar包圖片
首先寫好這麼一個最重要的類,其次再寫一個執行的邏輯的類,如下部分,這裡不要複製我的程式碼,你自己寫一個類,哪怕是輸出system.out.println(“123”);前往不要忘了繼承自Job

public class QuartzCheckDatabaseMail implements Job {
    public static Logger log = Logger.getLogger(QuartzCheckDatabaseMail.class);
    @Override
    public void execute(JobExecutionContext arg0) throws JobExecutionException {
        String RMIIP=AdminUtil.getParameter("RMIIP");
        String recipients=AdminUtil.getParameter("recipients");
        Mail mail= new Mail();
        String hospitalNames=AdminUtil.getParameter("hospitalNames");
        String hospitalUrls=AdminUtil.getParameter("hospitalUrls");
        String mailMessage=mail.connectInfor(hospitalUrls,"BI_MO", "BI_MO");
        log.info("開始RMI通訊");
        try {
            IMail Imail=(IMail)Naming.lookup(RMIIP+"/IMail");
            Imail.sendMail(mailMessage,"各資料庫連線情況(能否正常連線)",recipients);
        } catch (RemoteException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (NotBoundException e) {
            e.printStackTrace();
        }
    }

最後再記下基礎知識:commons-collection.jar、commons-logging、jta 這三jar包的作用。
commons-collection使用
源於Jakarta Jakarta做commons系列的目的是程式碼的重用,將一些可以通過的包做成元件。
可以當成Java.util的擴充套件

commons-collection的包結構:
org.apache.commons.collections – Commons Collections自定義的一組公用的介面和工具類
org.apache.commons.collections.bag – 實現Bag介面的一組類
org.apache.commons.collections.bidimap – 實現BidiMap系列介面的一組類
org.apache.commons.collections.buffer – 實現Buffer介面的一組類
org.apache.commons.collections.collection – 實現java.util.Collection介面的一組類
org.apache.commons.collections.comparators – 實現java.util.Comparator介面的一組類
org.apache.commons.collections.functors – Commons Collections自定義的一組功能類
org.apache.commons.collections.iterators – 實現java.util.Iterator介面的一組類
org.apache.commons.collections.keyvalue – 實現集合和鍵/值對映相關的一組類
org.apache.commons.collections.list – 實現java.util.List介面的一組類
org.apache.commons.collections.map – 實現Map系列介面的一組類
org.apache.commons.collections.set – 實現Set系列介面的一組類

commons-logging的作用

我們都知道log4j是用來記錄程式執行時的情況的,但是在一個web專案中,不可能簡單的將log4j或者其他記錄日誌的jar

包植入程式,這個時候common-logging就派上用場了,有了它後,只需要將類似log4j這樣的日誌包匯入classpath中,就可以
被應用自動作為低層實現。類裡面引用也只需要public static Logger log=Logger.getLogger(類名.class);然後log.info();

jta jar包的作用

jta: java transaction API

相對於JDBC來說,jta是多庫的事務(事務:要麼全過,要麼都不過)