您的位置:首页 > 其它

SSH&Nutz框架使用定时器quartz

2015-12-26 16:08 405 查看
SSH&Nutz框架使用定时器quartz

作者:vashon

时间:20151226

本篇介绍两套框架下quartz的使用

首先下载quartz-1.6.0.jar架包,并添加到lib目录下。

一、Nutz框架中使用定时器

1.建立Schedule类:

package com.xxx.xxx.mail.timer;

import org.nutz.ioc.loader.annotation.IocBean;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;

/**
* 邮件定时器
* @author ywx
*
*/
@IocBean
public class MailSchedule {
SchedulerFactory sf = null;
Scheduler sched = null;
JobDetail job = null;
/**
* 启动定时器
*/
public void startSchedule(){
sf = new StdSchedulerFactory();
try {
sched=sf.getScheduler();
job=JobBuilder.newJob(MailJob.class).build();
CronTrigger cTrigger=new MailCronTrigger().cronTrigger;
sched.scheduleJob(job, cTrigger);
sched.start();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
/**
* 停止定时器
*/
public void shutdownSchedule() {
if (null != sched) {
try {
sched.shutdown();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}

}


2.写好定时需要做的事情:

package com.xxx.xxx.mail.timer;

import java.util.Calendar;
import java.util.Date;

import org.nutz.ioc.Ioc;
import org.nutz.ioc.impl.NutIoc;
import org.nutz.ioc.loader.combo.ComboIocLoader;
import org.nutz.log.Log;
import org.nutz.log.Logs;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

import com.xxx.xxx.at.MeetingAt;
import com.xxx.util.MailUtils;
import com.xxx.util.PropertyUtils;

/**
* 定时器执行任务内容
* @author ywx
*
*/
public class MailJob implements Job{

Ioc ioc = null;
private Log logger = Logs.get();

private MailUtils mailUtils=null;

/**
* 获取当前日期是星期几
* @param time 当前日期
* @return
* @throws Exception
*/
public static String isFriday(Date time){
Calendar c=Calendar.getInstance();
c.setTime(time);
int dayForWeek=0;
if(c.get(Calendar.DAY_OF_WEEK)==1){
dayForWeek=7;
}else{
dayForWeek=c.get(Calendar.DAY_OF_WEEK)-1;
}
return String.valueOf(dayForWeek);
}

@SuppressWarnings("static-access")
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
//当标记为"0"时,任务定时器不启动
if("0".equals(PropertyUtils.getProperty("emaiTimerFlag"))){
logger.info("定时器Job不启动");
return;
}
logger.info("定时器Job启动");
try{
if(ioc==null){
ioc = new NutIoc(new ComboIocLoader("*org.nutz.ioc.loader.json.JsonLoader", "ioc/", "*org.nutz.ioc.loader.annotation.AnnotationIocLoader",
"com.wonders"));
}
if (mailUtils == null) {
mailUtils = ioc.get(MailUtils.class);
//这种提醒的邮件的“会议主题”放在下面的方法取出 (MeetingAt.getMeetingIds())
//				mailUtils.sendbatch(MailUtils.getFromPerson(), MailUtils.addToperson(), "","");
//				mailUtils.sendbatch(MailUtils.getFromPerson(), MailUtils.addToperson(), MeetingAt.getMeetingIds());
//发送
mailUtils.bactchSendPrompt(MailUtils.getFromPerson(),MailUtils.addToperson(),MailUtils.getAllInfo());
}
}catch(Exception e){
e.printStackTrace();
}finally{
ioc.depose();
}
}
public static void main(String args[]){
String str[]=PropertyUtils.getProperty("sendTime").split("\\s+");
System.out.println(str[str.length-2]);
}
}


3.在什么时候执行任务:

package com.xxx.xxx.mail.timer;

import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.TriggerBuilder;

import com.xxx.util.PropertyUtils;

public class MailCronTrigger {
public CronTrigger cronTrigger = null;
public MailCronTrigger(){
//获取邮件定时发送时间
String cron = PropertyUtils.getProperty("sendTime");
CronScheduleBuilder schedule = CronScheduleBuilder.cronSchedule(cron);
cronTrigger = TriggerBuilder.newTrigger().withSchedule(schedule).build();
}

}


4.写好定时器之后,还有配置服务启动配置:

package com.xxx.tiles.extend.setup;

import org.nutz.ioc.Ioc;
import org.nutz.mvc.NutConfig;
import org.nutz.mvc.Setup;
import org.nutz.mvc.annotation.Filters;

import com.jacob.com.MainSTA;
import com.xxx.project.support.timer.ProjectSchedule;
import com.xxx.xxx.mail.timer.MailSchedule;
import com.xxx.xxx.support.timer.SignSchedule;
import com.xxx.tiles.dic.DicConfigManager;

@Filters
public class ConfigSetup implements Setup {

public void init(NutConfig nc) {
Ioc ioc = nc.getIoc();

//启动邮件定时器
MailSchedule mailSchedule=ioc.get(MailSchedule.class);
mailSchedule.startSchedule();

}

public void destroy(NutConfig nc) {
Ioc ioc = nc.getIoc();
//停止邮件定时器
MailSchedule mailSchedule=ioc.get(MailSchedule.class);
mailSchedule.shutdownSchedule();
}

}


5.Nutz的MainModule类上加上,作用:启动服务时开启定时器。

@SetupBy(ConfigSetup.class)


示例如下:

@IocBy(type=ComboIocProvider.class,args={"*org.nutz.ioc.loader.json.JsonLoader","ioc/",
"*org.nutz.ioc.loader.annotation.AnnotationIocLoader","com.wonders"})
@Modules(scanPackage=true)
@SetupBy(ConfigSetup.class)
@Filters({@By(type = SessionFilter.class,args={"/index"})})
@AdaptBy(type = SearchTableAdaptor.class)
@Fail("ioc:errView")
public class MainModule { 代码省略。。。  }


附言:以上的实例就是这么简单粗暴实用。。。。。。

二、SSH框架中使用定时器

SSH框架中使用定时器比较Nutz来说要简单明了,不要去写CronTrigger和Schedule了;使用有两种方式(本篇文章具体介绍一种方式足以)。

1. 在web.xml中配置监听quartz:

<listener>
<listener-class>org.quartz.ee.servlet.QuartzInitializerListener</listener-class>
</listener>


2.添加quartz_jobs.xml文件,并在该配置文件中增加job节点信息:

<?xml version="1.0" encoding="gb2312"?>
<quartz>
<job>
<id>1</id>
<description>定时发送短信每半小时(每30分钟的第一分钟)发送一次</description>
<job-detail>
<name>J1</name>
<group>DEFAULT</group>
<job-class>com.xxxx.tiles.sms.task.TimerSendJob</job-class>
</job-detail>
<trigger>
<cron>
<name>T1</name>
<group>DEFAULT</group>
<job-name>J1</job-name>
<job-group>DEFAULT</job-group>
<cron-expression>0 1/30 * * * ?</cron-expression>
</cron>
</trigger>
</job>
<job>
<id>2</id>
<description>每天23点数据对账</description>
<job-detail>
<name>J2</name>
<group>DEFAULT</group>
<job-class>com.xxxx.xxxx.xxxx.factory.DataChecking</job-class>
</job-detail>
<trigger>
<cron>
<name>T2</name>
<group>DEFAULT</group>
<job-name>J2</job-name>
<job-group>DEFAULT</job-group>
<cron-expression>0 35 13 ? * *</cron-expression>
</cron>
</trigger>
</job>
<job>
<id>3</id>
<description>每天12点完成心跳包的操作,作用:监控服务是否正常运行.</description>
<job-detail>
<name>J3</name>
<group>DEFAULT</group>
<job-class>com.xxxx.xxxx.dj.factory.DataCheckClear</job-class>
</job-detail>
<trigger>
<cron>
<name>T3</name>
<group>DEFAULT</group>
<job-name>J3</job-name>
<job-group>DEFAULT</job-group>
<cron-expression>0 0 12 * * ?</cron-expression>
</cron>
</trigger>
</job>
</quartz>


3.定时业务方法:

package com.xxx.xxx.xxx.factory;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;

import org.apache.log4j.Logger;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import antlr.collections.List;

import com.xxx.core.utils.DateUtils;
import com.xxx.core.utils.SpringContextHolder;
import com.xxx.xxx.dj.dao.DataSendingDao;
import com.xxx.xxx.dj.entity.DataSending;
import com.xxx.xxx.dj.service.ReceiveService;
import com.xxx.xxx.dj.service.SendMessageService;

/**
* 数据对账,定时发送数据<p>
*/
@Component
@Transactional
public class DataChecking implements Job{

@Autowired
private SendMessageService sendMessageService;
@Autowired
private DataSendingDao dataSendingDao;

private static final String FAIL_FLAG = "0";

/** 日志 */
private Logger logger = Logger.getLogger(DataChecking.class);

@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
//获取上下文环境
ApplicationContext ctx = SpringContextHolder.getApplicationContext();
ReceiveService receiveService = ctx.getBean(ReceiveService.class);

//orgName和password从政务大厅获取;统计开始时间、统计结束时间在application中配置,json在service中获取.
long startSend = System.currentTimeMillis();
logger.info("==========[数据对账启动]开始=========");
System.out.println("数据对账启动时间:"+DateUtils.date2String(new Date(), DateUtils.FORMAT_DATETIME));
String result = receiveService.getResult("XXXXXXX(单位名称)", "123456");
logger.info("==========数据对账结果:"+result+"===================");
logger.info("==========[数据对账启动]结束-共花费[" + (System.currentTimeMillis() - startSend) + "]毫秒==========");

//结果result(Y:发送成功,N:发送失败).
//处理数据对账失败的数据
if("N".equals(result)){
this.updateDataZwdt2shzz();
}
}
/**
* 将前置机exdata_receiving表错误信息对应的数据作为标记更新到xxxxxxx库中.
*/
public void updateDataZwdt2shzz(){
//======查询前置机错误信息表exdata_receiving=======
Connection conn = sendMessageService.getZwdtConnection();
PreparedStatement pstmt=null;
ResultSet rs = null;
String sql = "SELECT ST_MEMO FROM [exdata].[dbo].[EXDATA_RECEIVING] WHERE ST_MEMO IS NOT NULL";

try {
pstmt=conn.prepareStatement(sql);
rs = pstmt.executeQuery();
while(rs.next()){
//取得错误信息内容
String content = rs.getString(1);
//截取第一位序号ID
String nmSeqId = content.substring(0, content.indexOf("SHSTSH")).trim();
String hql = " from DataSending d where d.nmSeqId = ?";
DataSending dataSending = null;
java.util.List<DataSending> dataSendingList = dataSendingDao.find(hql, Integer.parseInt(nmSeqId));
for(int i=0;i<dataSendingList.size();i++){
dataSending = dataSendingList.get(0);
if(dataSending != null){
//设置xxxxxx库中对账失败的数据标记为"0"
dataSending.setStatus(FAIL_FLAG);
//设置xxxxx库退回表中的错误信息
dataSending.setStMemo(content);
//更新到数据库
dataSendingDao.saveOrUpdate(dataSending);
}
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}


附言:相对Nutz框架来说,ssh中使用定时器方便多了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: