众所周知,Quartz是一个开源的作业调度框架,它完全由Java写成,并设计用于J2SE和J2EE应用中。它提供了巨大的灵 活性而不牺牲简单性。你能够用它来为执行一个作业而创建简单的或复杂的调度。如何做一个复杂的定时作业使用quartz是个不错的选择。不过,小任务就大材小用了。土豆我今天在这里讲解的就是直接使用JDK自带的Timer,TimerTask来进行简单的定时作业。
首先,说一下哪些场合要使用到定时作业呢。比如那些要实时处理的数据,以及一些需要统计的数据,尤其是一些大的数据统计,通常的做法就是做一个定时任务,在深夜时进行查询统计,将查询的结果放到一个统计的小表中,然后将查询出的结果显示出来。这样就减轻的服务器的压力。因为白天查询大型数据的话,无疑是浪费时间,资源,而且会出现一些问题。晚上服务器的负担则相对小很多很多。
好了不多说,贴代码。
先定义一个Servlet。因为Servlet可以在WEB启动时立即启动。仅需简单的配置即可。
package com.sinoglobal.servlets;
import java.io.IOException;
import java.util.Calendar;
import java.util.Timer;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.sinoglobal.timer.SendQueryTimer;
@SuppressWarnings("serial")
public class SendQueryServlet extends HttpServlet {
private SendQueryTimer sendQuerytimer;
private Timer timer2;
public SendQueryServlet() {
super();
}
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
if (timer2 != null) {
timer2.cancel();
}
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
/**
* Initialization of the servlet. <br>
*
* @throws ServletException
* if an error occurs
*/
public void init() throws ServletException {
System.out.println("查询短信初始化:");
// 定时器开关
String startTask = getInitParameter("startTask");
// 开始运行时间
Calendar calendar = Calendar.getInstance();
// 缓冲时间(分钟)
Long intervalTime = Long.parseLong(getInitParameter("intervalTime"));
// 启动定时器
if (startTask.equals("true")) {
timer2 = new Timer(true);
sendQuerytimer = new SendQueryTimer();
timer2.schedule(sendQuerytimer, calendar.getTime(),
intervalTime * 1000);
}
}
}
上面代码就是在servlet初始化时启动SendQueryTimer,使用timer的schedule来完成定时任务。在destroy中我们可以看到timer的cancle()方法可以停止timer。最后schedule看它的英文单词就可以知道,计划,调度的意思。
查看JDK的源码:
public void schedule(TimerTask task, Date firstTime, long period) {
if (period <= 0)
throw new IllegalArgumentException("Non-positive period.");
sched(task, firstTime.getTime(), -period);
}
我们可以看到这个方法第一个参数是一个任务,第二个参数是任务作业的开始时间,第三个很显然是相隔的时间段period[即后一次任务作业距离上一次任务作业的时间 ]。它的单位是毫秒。源码中很明显说:如果小于等于0会报错。
下面我们来看看WEM.XML中配置这个servlet。
<servlet>
<servlet-name>SendSmsServlet</servlet-name>
<servlet-class>
com.sinoglobal.servlets.SendSmsServlet
</servlet-class>
</servlet>
<servlet>
<servlet-name>SendQueryServlet</servlet-name>
<servlet-class>
com.sinoglobal.servlets.SendQueryServlet
</servlet-class>
<init-param>
<!-- // 定时器开关 -->
<param-name>startTask</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<!-- // 缓冲时间 ss-->
<param-name>intervalTime</param-name>
<param-value>60</param-value>
</init-param>
<load-on-startup>10</load-on-startup>
</servlet>
看这个intervalTime其它没必要看了 ,你们懂的。intervalTime是配置这个period的时间段的。60就是60毫秒。如果我配置一分钟呢,那就是60*1000;
好,下面我们看TimerTask中怎么具体执行一个任务呢。
OK,接下来看这个SendQueryTimer中的代码。
package com.sinoglobal.timer;
import java.util.TimerTask;
import com.sinoglobal.dao.SendDao;
import com.sinoglobal.service.SendService;
public class SendQueryTimer extends TimerTask {
private static boolean isRunning = true;
@Override
public void run() {
if (isRunning) {
new Thread(new SendService(new SendDao())).start();
}
}
}
SendQueryTimer
必须得继承TimerTask执行,实现它的run方法,在run方法中启动线程执行任务。
package com.sinoglobal.service;
import com.sinoglobal.dao.SendDao;
import com.sinoglobal.entity.Send;
public class SendService implements Runnable {
private SendDao sd;
public SendService(SendDao sd2) {
this.sd = sd2;
}
public SendService() {
super();
}
private void querySend(SendDao sdao){
//具体业务代码,查询数据
}
public void run() {
System.out.println("发送短信查询:");
querySend(sd);
}
// 测试查询的timer。
public static void main(String[] args) {
SendDao sdao = new SendDao();
SendService sendservice = new SendService(sdao);
sendservice.run();
}
}
//在这个线程中我们可以写上自己的业务代码,实现具体业务。当然你可以根据你的查询结果进行相应操作。
使用Timer,TimerTask做一个定时任务,变得简单明了。
OK,打完睡觉。
本文链接:点击打开链接
分享到:
相关推荐
利用jdk中的timer和timertask来实现,每天定时执行的任务。
本文档主要讲述的是Java中的Timer和TimerTask的使用;Timer是一个定时器类,通过该类可以为指定的定时任务进行配置。TimerTask类是一个定时任务类,该类实现了Runnable接口,而且是一个抽象类。希望本文档会给有需要...
Java中的Timer和TimerTask简介(附完整代码实例)。 在Java中,Timer和TimerTask是两个经常用来实现定时器的类。这两个类使用起来非常方便,可以完成我们对定时器的绝大多数需求。 Timer是一种定时器工具,用来在一...
Java里timer执行定时任务
Timer和TimerTask的使用 关于java函数中timer类的相关代码 和使用
java定时任务,每天定时执行任务,每天到这个时间点都会执行
主要介绍了Java 中Timer和TimerTask 定时器和定时任务使用的例子,非常具有实用价值,需要的朋友可以参考下
timerTask实现每天定时一段时间内执行定时任务,这个是自己写的代码,有些和我的项目有关,可以删掉,但是其主要的都在里面,我写了注释。
java类Timer和TimerTask的使用.doc
本文首先设计一个单次定时器Timer+TimerTask,然后再次基础上设计一个循环定时器。
java类Timer和TimerTask的使用.pdf
工作中常常会有定时任务的开发需求,特别是移动端。最近笔者正好有所涉及,鉴于此,结合开发中的案例说明一下几种定时任务的 退出 。 需求说明 :定时更新正在生成的文件大小和状态【进行中、失败、完成】,如果...
主要为大家详细介绍了java定时任务Timer和TimerTask使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
Java计时器Timer和TimerTask用法总结
下面是一个在Android中使用定时器Timer和TimerTask的启动,停止,暂停,继续等操作的demo。 需要注意的问题主要有两点: 1、Timer和TimerTask在调用cancel()取消后不能再执行 schedule语句 2、只能在UI主线程中更新...
所有类型的 Java 应用程序一般都需要计划重复执行的任务。企业应用程序需要计划每日的日志或者晚间...在本文中,Java 开发人员 Tom White 向您展示了如何构建一个简单通用的计划框架,以用于执行任意复杂的计划任务。
java定时任务调度Timer简单示例代码 ,
Android Timer TimerTask Handler 三者结合实现 数据更新与View更新的同步。 一个不错的机制。
JavaTimer和TimerTask实例教程Java开发Java经验技巧共3页.pdf.zip
主要介绍了java Timer 定时每天凌晨1点执行任务的代码,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下