定时操作,公司里叫定时任务调度,我用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是多库的事务(事务:要么全过,要么都不过)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值