您的位置:首页 > 编程语言 > Java开发

Java Web项目中定时器Timer的使用

2017-08-18 16:11 337 查看
在以前的文章中,曾经写过一个调度器Quartz的使用实例,今天,分享一个JDK自带的定时器Timer在Java Web项目中的使用。

首先,简单说一下Quartz和Timer的相同和不同之处:

相同:他们都是定时去执行一些操作,比如,定时删除一些过期数据,定时发送一些通知消息等等。

区别:Quartz是一个开源的任务调度框架,需要进行配置和加入相应的依赖,而Timer是JDK自带的一个定时器,无需配置。

总结: 因为Quartz是一个开源的任务调度框架,所以功能更为强大和全面,但是使用较为繁琐,而Timer功能较Quartz来说简单一点,所以,复杂的任务调度最好使用Quartz,简单的任务调度使用Timer。

1、使用Timer首先要写一个任务类,代码如下:

package com.siweisoft.timer;

import javax.servlet.ServletContext;
import java.util.TimerTask;

/**
* 定时器任务类:主要是继承 TimerTask并实现它的run 方法
* Created by Robin on 2017-08-03.
*/
public class AutoReceiptJob extends TimerTask{

private static boolean isRunning = false;

private ServletContext context = null;

public AutoReceiptJob() {
super();
}

public AutoReceiptJob(ServletContext context) {
this.context = context;
}
int count = 1;
@Override
public void run() {
if (!isRunning) {
context.log("开始执行指定任务");

/**
* 自己的业务代码
*/
System.out.println("定时器运行了"+count+"次");
count++;

isRunning = false;
context.log("指定任务执行结束");
} else {
context.log("上一次任务执行还未结束");
}
}

}


2、因为这是web项目,需要写一个监听器来监听容器的启动与销毁,代码如下:

package com.siweisoft.timer;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import java.util.Calendar;
import java.util.Date;

/**
* 监听类:监听服务器的启动并将任务添加到任务栈
* Created by Robin on 2017-08-03.
*/
public class ContextListener implements ServletContextListener{

public ContextListener() {
}

private java.util.Timer timer = null;

/**
* 初始化定时器
* web 程序运行时候自动加载
*/
@Override
public void contextInitialized(ServletContextEvent arg0) {

/**
* 设置一个定时器
*/
timer = new java.util.Timer(true);

arg0.getServletContext().log("定时器已启动");

/**
* 定时器到指定的时间时,执行某个操作(如某个类,或方法)
*/
//设置执行时间
Calendar calendar =Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day =calendar.get(Calendar.DAY_OF_MONTH);//每天
//定制每天的1:00:00执行,
calendar.set(year, month, day, 01, 00, 00);
Date date = calendar.getTime();
//        System.out.println(date);

int period = 24 * 60 * 60 * 1000;
//每天的date时刻执行task,每隔persion 时间重复执行
timer.schedule(new AutoReceiptJob(arg0.getServletContext()), 2000L, 1000L);
//        在 指定的date时刻执行task, 仅执行一次
//        timer.schedule(new AutoReceiptJob(arg0.getServletContext()), date);
arg0.getServletContext().log("已经添加任务调度表");

}
/**
* 当服务器停止时,定时器销毁
*/
@Override
public void contextDestroyed(ServletContextEvent arg0){
timer.cancel();
arg0.getServletContext().log("定时器销毁");
}
}


3、在web.xml配置一下监听器,代码如下:

<listener>
<listener-class>com.sxl.ContextListener</listener-class>
</listener>


当服务器启动是,任务类会按照设定好的时间或时间间隔去执行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: