由于刚开始写博客,很多使用技巧都不熟悉,所以欢迎大家多多指正,我将会不断的完善写过的文章,包括代码的优化和图片的重新选择。
最近在公司被让做一个,定时自动检测多台远程服务器数据库的功能,今天我把我找到的解决方式记录在这里,由于一次无法写完,我先把定时任务实现的操作记录在这里。
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是多库的事务(事务:要么全过,要么都不过)