quartz简略实例

quartz简单实例

最近做事务管理的项目,有用到quartz定时发信息的功能,现在将代码贴出来大家拍拍砖

 

 

首先引用quartz包至项目下, 然后在web.xml中加上listener,类名为:ScheduleExecutionService 

 

相关java文件如下

 

ScheduleExecutionService .java

 

/***********

 

package quartz;

 

import org.quartz.Job;

import org.quartz.JobExecutionContext;

import org.quartz.JobExecutionException;

 

import javax.servlet.http.HttpServletRequest;

import sofocus.db.model.result.DbResult;

import sofocus.db.model.result.DbRow;

import sofocus.iframe.jms.JmsManager;

import sofocus.portal.service.QuartzService;

import sofocus.service.ServiceFactory;

 

public class ScheduleExecutionService implements Job{

public void execute(JobExecutionContext context) throws JobExecutionException {

// 启动时的定时任务,可以加载一些默认的定时任务。

// 如果是把定时规则存入数据库了,需要动态定时的,需要用其他方式加载定时。如项目启动时根据存储的时 间规则,加载一些定时任务。

//根据即时查询数据库存储的任务定时,来触发定时器

QuartzMethod quartzMethod = new QuartzMethod();

boolean flag = quartzMethod.sendMsg(context);

if(flag){

System.out.println("*******************事务调度启动成功***************");

}else{

System.out.println("******************事务调度启动失败****************");

}

}

}

 

 

*************/

 

QuartzMethod .java

 

/***************

package quartz;

 

import java.text.DateFormat;

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.HashMap;

 

import javax.servlet.http.HttpServletRequest;

 

import org.quartz.CronTrigger;

import org.quartz.JobDetail;

import org.quartz.JobExecutionContext;

import org.quartz.Scheduler;

import org.quartz.SchedulerException;

import org.quartz.SchedulerFactory;

import org.quartz.SimpleTrigger;

import org.quartz.Trigger;

import org.quartz.impl.StdSchedulerFactory;

 

import sofocus.db.model.result.DbResult;

import sofocus.db.model.result.DbRow;

import sofocus.iframe.jms.JmsManager;

import sofocus.portal.service.PersonWorkService;

import sofocus.portal.service.QuartzService;

import sofocus.service.ServiceFactory;

public class QuartzMethod{

/**

* 定义几个变量

*/

static HttpServletRequest request;

private static Scheduler scheduler;

private static CronTrigger cronTrigger;

private static JobDetail jobDetail;

private static String jobName = "";

private static String dateTime = "0/5 * * * * ?";

private static String groupName = scheduler.DEFAULT_GROUP;

private final static QuartzService quartzService = ServiceFactory.getService(QuartzService.class);

private final static PersonWorkService pwService = ServiceFactory.getService(PersonWorkService.class);

    private static SchedulerFactory sf = new StdSchedulerFactory(); 

DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");

//添加单个事务(job)

public static void addMethod(String jobName,String groupName,String dateTime){

try {

delMethod(jobName, groupName);

} catch (SchedulerException e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

}

try {

scheduler = StdSchedulerFactory.getDefaultScheduler();

scheduler.start();

} catch (SchedulerException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

jobDetail = new JobDetail(jobName,groupName,ScheduleExecutionService.class);

cronTrigger = new CronTrigger(jobName,groupName);

cronTrigger.setName(jobName);

try {

cronTrigger.setCronExpression(dateTime);

scheduler.scheduleJob(jobDetail, cronTrigger);

} catch (ParseException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (SchedulerException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

/**

* 添加日常性事务

* @param jobName  任务名称

* @param jobGroup 任务组名称

* @param triggerName //事务名称

* @param triggerGroup //事务组名称

* @param startTime    //开始执行时间

* @param repeatInterval //设置间隔时间

* @param repeatCount   //设置循环次数

* @param params          

* @throws SchedulerException

*/

public static void addJob(String  jobName,String  jobGroup,  

           String  triggerName,String  triggerGroup,Date startTime,  

           Integer repeatInterval,Integer repeatCount,HashMap<String,Object> params) throws   

           SchedulerException{  

       JobDetail jobDetail = new JobDetail(jobName, jobGroup, ScheduleExecutionService.class);  

       if(params != null){  

            jobDetail.getJobDataMap().put("params",params);  

        }  

       //触发器  

       SimpleTrigger simpleTrigger = new SimpleTrigger(triggerName, triggerGroup);  

       //设置开始时间  

       simpleTrigger.setStartTime(startTime);  

       //设置间隔时间  

       simpleTrigger.setRepeatInterval(repeatInterval);  

       //设置调用次数  

       simpleTrigger.setRepeatCount(repeatCount);  

         

       Scheduler sched = sf.getScheduler();  

       sched.scheduleJob(jobDetail,simpleTrigger);  

       if(!sched.isShutdown())  

          sched.start();  

   }  

//程序启动时插入所有的事务

public static void addAllMethod(){

DbResult remindRes = quartzService.find(request, "obj_status=1 and row_status=1").getFirstResult();

if(!remindRes.isEmpty()){

for(DbRow row : remindRes){

jobName = row.getString("job_name");

dateTime = row.getString("ruler");

groupName = row.getString("group_name");

try {

delMethod(jobName, groupName);

} catch (SchedulerException e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

}

try {

scheduler = StdSchedulerFactory.getDefaultScheduler();

scheduler.start();

} catch (SchedulerException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

jobDetail = new JobDetail(jobName,groupName,ScheduleExecutionService.class);

cronTrigger = new CronTrigger(jobName,groupName);

cronTrigger.setName(jobName);

try {

cronTrigger.setCronExpression(dateTime);

scheduler.scheduleJob(jobDetail, cronTrigger);

} catch (ParseException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (SchedulerException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}else{

jobDetail = new JobDetail("default_jobName4",

Scheduler.DEFAULT_GROUP, ScheduleExecutionService.class);

 

cronTrigger = new CronTrigger("default_jobName4",

Scheduler.DEFAULT_GROUP);

try {

scheduler = StdSchedulerFactory.getDefaultScheduler();

scheduler.start();

cronTrigger.setCronExpression(dateTime);

scheduler.scheduleJob(jobDetail, cronTrigger); // 客户

} catch (Exception e) {

System.out.println("任务调度 开启 失败");

e.printStackTrace();

}

}

}

/**

* 根据任务名和任务组名修改任务的触发时间

* @param jobName

* @param jobGroupName

* @param dateTime

* @throws SchedulerException 

*/

public static void modifyJobTime(String jobName,String jobGroupName,String dateTime) throws SchedulerException{

Scheduler sched = sf.getScheduler();  

        Trigger[] trigger = sched.getTriggersOfJob(jobName,jobGroupName);  

        if(trigger != null){  

            for(int i=0;i<trigger.length;i++){  

                try {

((CronTrigger)trigger[i]).setCronExpression(dateTime);

} catch (ParseException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}  

                sched.resumeTrigger(trigger[i].getName(),trigger[i].getGroup());  

            }  

        }  

}

 

    /** 

    * 根据触发器名修改一个任务的触发时间 

    * @param triggerName触发器名 

    * @param triggerGroupName触发器组名 

    * @param time 

    * @throws SchedulerException 

    * @throws ParseException 

    */  

    public static void modifyTriggerTime(String triggerName,String triggerGroupName,  

                 String time)  throws SchedulerException, ParseException{  

        Scheduler sched = sf.getScheduler();  

        Trigger trigger = sched.getTrigger(triggerName,triggerGroupName);  

        if(trigger != null){  

            //修改时间  

            ((CronTrigger)trigger).setCronExpression(time);  

           //重启触发器  

           sched.resumeTrigger(triggerName,triggerGroupName);  

       }  

    } 

/**

* 移除一个任务

* @param jobName

* @param groupName

* @return

* @throws SchedulerException

*/

public static boolean delMethod(String jobName,String groupName) throws SchedulerException{

boolean result = false;

if(scheduler !=null){

try {

scheduler.deleteJob(jobName, groupName);

} catch (SchedulerException e) {

// TODO Auto-generated catch block

e.printStackTrace();

result = false;

}

}

return result;

}

/** 

    * 移除一个任务 

    * @param jobName任务名 

    * @param jobGroupName任务组名 

    * @param triggerName触发器名 

    * @param triggerGroupName触发器组名 

    * @throws SchedulerException 

    */  

    public static void removeJob(String jobName,String jobGroupName,  

            String triggerName,String triggerGroupName)   

            throws SchedulerException{  

      Scheduler sched = sf.getScheduler();  

      sched.pauseTrigger(triggerName,triggerGroupName);//停止触发器  

      sched.unscheduleJob(triggerName,triggerGroupName);//移除触发器  

      sched.deleteJob(jobName,jobGroupName);//删除任务  

    } 

    /** 

     * 计算时间表达式 

     * @param second        秒 

     * @param minute        分 

     * @param hour          时 

     * @param day           日期 

     * @param month         月份 

     * @param week          星期 

     * @param year          年份 

     * @param isContactYear 是否包括年份 

     * @return 

     */  

    public static String getCexpress(String second,String minute,String hour,  

            String day,String month,String week,String year,boolean isContactYear) {  

        String cexpress="";  

        //秒,默认为"0" 取值范围:0-59  

        if(second != null && !"".equals(second)){  

            cexpress+=second+" ";  

        }else{  

            cexpress+="0 ";  

        }  

 

        /** 

         * 分 取值范围:0-59 

         * 默认为"*"      表示每一分钟 

         * 如果是0 12     表示整12:00触发 

         * 如果是0/5 12   表示在每天下午12点到12:55期间的每5分钟触发 , 

         * 如果是0-5 12   表示12:00到12:05期间的每1分钟触发 

         * 如果是10,15 12 表示12:10和12:15触发 

         */  

        if(minute != null && !"".equals(minute)){  

            cexpress+=minute+" ";  

        }else{  

            cexpress+="* ";  

        }  

 

        /** 

         * 小时 取值范围:0-23 

         * 默认为"*"      表示每一个小时 

         * 如果是0        表示凌晨触发 

         * 如果是0-5        表示凌晨到5:00期间 

         * 如果是10,15    表示10:00和15:00触发 

         */  

        if(hour != null && !"".equals(hour)){  

            cexpress+=hour+" ";  

        }else{  

            cexpress+="* ";  

        }  

 

        /** 

         * 日期 取值范围:1-31 

         * 默认为"*" 表示每天 

         * 如果是15  表示每个月的15号 

         * 如果是L   表示每个月最后一天  

         * 注:在指定了星期的时候,把日期这里设置为"?" 

         */  

        if(day != null && !"".equals(day)){  

            cexpress+=day+" ";  

        }else{  

            cexpress+="? ";  

        }  

 

        /** 

         * 月份 取值范围:1-12 

         * 默认为"*"  表示每个月 

         * 如果是 12  表示12月份 

         */  

        if(month != null && !"".equals(month)){  

            cexpress+=month+" ";  

        }else{  

            cexpress+="* ";  

        }  

 

        /** 

         * 星期  取值范围:1-7 MON,TUE,WED,THU,FRI,SAT,SUN  其中1表示星期日,以此类推 

         * 默认为"?" 

         * 如果是WED      表示每个星期三 

         * 如果是MON-FRI  表示星期一到星期五 

         * 如果是6L       表示每月最后一个星期五 

         * 如果是6#3      表示每月第三个星期五 

         */  

        if(week != null && !"".equals(week)){  

            cexpress+=week+" ";  

        }else{  

            cexpress+="? ";  

        }  

 

        //如果包括年份  

        if(isContactYear){  

            /** 

             * 年份  取值范围:1970-2099 

             * 默认值为空 

             * 如果是2010 表示只有2010年触发时间 

             * 如果是2010,2020 表示只有2010 

             */  

            if(year != null && !"".equals(year)){  

                cexpress+=year;   

            }  

        }  

        return cexpress;  

    }  

    public boolean sendMsg(JobExecutionContext context){

     String personId = "";

String url = "";

String content = "";

String affairsId = "";

String msg = "";

String addUser = "";

int person_type = 1;

String jobName = context.getJobDetail().getName();

String groupName = context.getJobDetail().getGroup();

boolean flag = false;

DbResult quartzRes = quartzService.find(request, "job_name = ? and group_name = ? and obj_status='1' and row_status = '1'",

new String[]{jobName,groupName},"content","affairs_id").getFirstResult();//取当前触发事务的结果集

if(!quartzRes.isEmpty()){

for(DbRow row : quartzRes){

content = row.getString("content");

affairsId = row.getString("affairs_id");

DbResult pwRes = pwService.find(request, "affairs_id = ? and obj_status='1' and row_status='1'",new String[]{affairsId},"-*,person_id,person_type,row_adduser","pwork_id desc").getFirstResult();

for(DbRow pwRow : pwRes){

personId = pwRow.getString("person_id");

person_type = pwRow.getInteger("person_type");

addUser =  pwRow.getString("row_adduser");

if(person_type==0){

url = "/sf/portal/affairs/affairs.do?action=toShowCjAffairs&param=2&affairs_id="+affairsId;

msg = "您当前有一条事务信息需要处理:<br/> <font color='blue'>"+content+"</font>["+df.format(new Date())+"]<br/><br/><a href='"+url+"' style='float:right'>点击查看</a>";

}else if(person_type==1){

url = "/sf/portal/affairs/affairs.do?action=toShowZxAffairs&param=2&affairs_id="+affairsId;

msg = "您当前有一条事务信息需要处理:<br/>    <font color='blue'>"+content+"</font>["+df.format(new Date())+"]<br/><br/><a href='"+url+"' style='float:right'>点击查看</a>";

}else if(person_type == 2){

url = "/sf/portal/affairs/affairs.do?action=toShowDbAffairs&param=2&affairs_id="+affairsId;

msg = "您当前有一条事务信息需要处理:<br/>    <font color='blue'>"+content+"</font>["+df.format(new Date())+"]<br/><br/><a href='"+url+"' style='float:right'>点击查看</a>";

}else if(person_type == 3){

url = "/sf/portal/affairs/affairs.do?action=toShowGxAffairs&param=2&affairs_id="+affairsId;

msg = "<font color='red'>"+addUser+"</font><strong>共享</strong>给您一条事务信息: <br/>    <font color='blue'>"+content+"</font>["+df.format(new Date())+"]<br/><br/><a href='"+url+"' style='float:right'>点击查看</a>";

}

//sendToUser()为封装的给指定人发送消息的方法,当然,如果你也可以自写方法

JmsManager.sendToUser(personId, "提醒信息",msg, "javascript:alert('打开消息中心')", "", "消息中心", "");

flag = true;

}

}

}

return flag;

    }

}

*************/