定时操作,公司里叫定时任务调度,我用Quartz(一)

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

原创粉丝点击