没有去仔细研究这两种定时器的API,会使用及能在项目中应用即可;
import org.quartz.CronExpression;
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;
一、JobDetail的用法
public void startTasl(ServletContext context, String jobName, String jobGroup,
SInterfacePara sInterP, String cexpReg) throws ParseException, SchedulerException {
//创建一个jobDetail对象=>jobName:自定义工作名称;jobGroup自定义工作组名称;启动的类(须实现Job接口)
JobDetail jobDetail = new JobDetail(jobName, jobGroup, SimpleJob.class);
//将所需对象参数放在此Map集合中,后续使用可取出(map.get("key"))
jobDetail.getJobDataMap().put("key", key);
//将servletContext 放置在Map中;
jobDetail.getJobDataMap().put("context", context);
//创建一对触发器对象;
CronTrigger cronTrigger = new CronTrigger("trigger" + jobName, "tgroup" + jobName);
//创建定时任务表达式,将表达式写入其中(此表达式的书写格式,最下面会有详细介绍);
CronExpression cexp = new CronExpression("表达式");// ①-2:定义Cron表达式
cronTrigger.setCronExpression(cexp);// ①-3:设置Cron表达式
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
scheduler.scheduleJob(jobDetail, cronTrigger);
scheduler.start();
}
二、实现 StatefulJob 接口
import org.quartz.CronTrigger;
import org.quartz.Job;
import org.quartz.JobDetail;
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;
public static void addJob(Task task,ServletContext context) throws SchedulerException, ParseException, InstantiationException, IllegalAccessException, ClassNotFoundException {
Scheduler sched = sf.getScheduler();
Job imp = (Job) Class.forName(task.getClassname()).newInstance();//具体的哪个类
JobDetail jobDetail = new JobDetail(task.getId(), JOB_GROUP_NAME, imp.getClass());//任务名,任务组,任务执行类
jobDetail.getJobDataMap().put("ServletContext", context);
//触发器
Trigger trigger = null;
if(task.getType()==1){
trigger = getSimpleTrigger(task);
}else{
trigger = getCronTrigger(task);
}
sched.scheduleJob(jobDetail,trigger);
//启动
if(!sched.isShutdown()){
sched.start();
}
}
public static Trigger getSimpleTrigger(Task task){
SimpleTrigger trigger = new SimpleTrigger(task.getId(),JOB_GROUP_NAME);
if(!(task.getStartTime().trim().equals(""))){
trigger.setStartTime(parseDateString(task.getStartTime()));
}else{
trigger.setStartTime(new Date());
}
if(!(task.getEndTime().trim().equals(""))){
trigger.setEndTime(parseDateString(task.getEndTime()));
}
if(task.getRepeatCount().equals("-1")){
trigger.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY);
}else{
trigger.setRepeatCount(Integer.parseInt(task.getRepeatCount()));
}
trigger.setRepeatInterval(Long.parseLong(task.getRepeatInterval())*1000L);
return trigger;
}
public static Trigger getCronTrigger(Task task){
CronTrigger trigger = new CronTrigger(task.getId(), TRIGGER_GROUP_NAME);//触发器名,触发器组
try {
trigger.setCronExpression(task.getContent());
} catch (ParseException e) {
e.printStackTrace();
}//触发器时间设定
return trigger;
}
定时的那个类要实现StatefulJob接口
三、线程(自个编写一个线程,在web.xml中启动时优先),下面有个案例,可套用;
1、web.xml添加配置
<servlet-name>MyServlet</servlet-name>
<servlet-class>my.person.engine.quartz.MyServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
2、编写一个servlet 继承HttpServlet, 初如化时去启动线程
public void init(ServletConfig config) throws ServletException {
super.init(config);
logger.info("初始化了吗");
try {
TestSubmit submit = new TestSubmit ();
submit.start();
} catch (Exception e) {
e.printStackTrace();
}
}
public class TestSubmit extends Thread {
public void run() {
//利用while循环不断的执行;
代码块 注:如果这里执行周期,必须保证线程不会起冲突,否则可能引起数据错误;
}
}
四、在监听中注册定时,继承TimerTask;
1、先在web.xml中进行注册;
<listener id="Listener_3">
<listener-class>
pde.ams.MobileContextListener
</listener-class>
</listener>
2、继承上下文监听
public class MobileContextListener implements ServletContextListener {
private static Logger logger = Logger.getLogger(MobileContextListener.class);
private Timer timer = null;
public void contextDestroyed(ServletContextEvent arg0) {
timer.cancel();
ProxoolFacade.shutdown(); //连接池关闭
}
public void contextInitialized(ServletContextEvent arg0){
timer = new Timer(true); //定时器已启动
// long delay = 5*1000; //5秒后执行
long delay = 0;
// long interval = 5*1000 ; //定时为 每5秒执行一次定时
long interval=13*1000;//实时发送
try {
timer.schedule(new DaiBanSendTaskJob(arg0.getServletContext()), delay, interval);//已经将全文索引添加任务调度表
} catch (Exception e) {
timer.cancel();
}
}
}
3、继承TimerTask 类
public class DaiBanSendTaskJob extends TimerTask {
public void run() {
}
}