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小时内删除。
发表评论