JAVA中使⽤TimerTimerTask轮循数据库,执⾏定时任务
也欢迎⼤家转载本篇⽂章。分享知识,造福⼈民,实现我们中华民族伟⼤复兴!
众所周知,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 j avax.servlet.http.HttpServlet;import javax.
jdk怎么使用servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import com.sinoglobal.timer.Sen dQueryTimer;@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.canc el();  } } public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { } public void doPost(Htt pServletRequest 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 = Instance();  // 缓冲时间(分钟)  Long intervalTime = Long.pa rseLong(getInitParameter("intervalTime"));  // 启动定时器if (startTask.equals("true")) {  timer2 = new Timer(true);  sendQuerytimer = new SendQueryT imer();  timer2.schedule(sendQuerytimer, Time(),    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, Time(), -period);    }
我们可以看到这个⽅法第⼀个参数是⼀个任务,第⼆个参数是任务作业的开始时间,第三个很显然是相隔的时间段period[即后⼀次任务作业距离上⼀次任务作业的时间 ]。它的单位是毫秒。源码中很明显说:如果⼩于等于0会报错。
下⾯我们来看看WEM.XML中配置这个servlet。
<servlet><servlet-name>SendSmsServlet</servlet-name><servlet-class>  com.sinoglobal.servlets.SendSmsServlet  </servlet-class></servlet><servl et><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 S endQueryTimer extends TimerTask{ private static boolean isRunning = true; @Override public void run(){  if (isRunning) {  new Thread(new SendServi ce(new SendDao())).start();  } }}
SendQueryTimer
必须得继承TimerTask执⾏,实现它的run⽅法,在run⽅法中启动线程执⾏任务。
package com.sinoglobal.service;import com.sinoglobal.dao.SendDao;import ity.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 m ain(String[] args){  SendDao sdao = new SendDao();  SendService sendservice = new SendService(sdao);  sendservice.run(); }}
//在这个线程中我们可以写上⾃⼰的业务代码,实现具体业务。当然你可以根据你的查询结果进⾏相应操作。
使⽤Timer,TimerTask做⼀个定时任务,变得简单明了。
OK,打完睡觉。
本⽂链接:
给我⽼师的⼈⼯智能教程打call!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。