定時操作,公司裡叫定時任務排程,我用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是多庫的事務(事務:要麼全過,要麼都不過)