最近做事务管理的项目,有用到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¶m=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¶m=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¶m=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¶m=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;
}
}