Web后台任务定时执行工具的设计与实现

 一.说道后台定时执行任务,肯定会想到Timer和开源定时器Quartz,他们都是后天定时控制的,现在我们的需求是做一个可控性很强的控制工具,前台有两个按钮 可以控制任务的开始和停止,废话少说,来开始我们的任务吧,

 

首先需要一个线程,这个线程来控制任务的执行,我们要做到线程完全被控制就得设置一个标识静态变量flag,这个线程里面还包括了开始和停止方法:

package com.aisino.jwd; /** * @author jwdstef */ public class MyTask extends Thread{ private static boolean sw = false; public void run(){ while(sw){ //执行所有业务 for(int i = 0 ; i <100;i++){ System.out.println("do............."+i); } } } /** * 开始任务 * author:jwdstef * 2010-5-5 */ public static void setOn(){ if(sw == false){ System.out.println("打开任务........."); sw = true; }else{ System.out.println("任务已经开始,无法再次打开......"); } } /** * 结束任务 * author:jwdstef * 2010-5-5 */ public static void setOff(){ if(sw == true){ System.out.println("关闭任务.........."); sw = false; }else{ System.out.println("任务已经关闭,无法再次关闭......."); } } }

 

任务执行类

package com.aisino.jwd; public class Test { static int i = 0; /** * author:jwdstef * 2010-5-5 * @param args */ public static void main(String[] args) throws InterruptedException { // TODO Auto-generated method stub exe(); } public synchronized static void exe() throws InterruptedException{ System.out.println(++i); MyTask mytask = new MyTask(); mytask.start(); Thread.sleep(1000); } }

 

控制页面index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head><title></title></head> <body>任务控制 <a href="on.jsp" mce_href="on.jsp">启动</a> <a href="off.jsp" mce_href="off.jsp">关闭</a> </body> </html>

 

启动页面 on.jsp

<%@ page import="com.aisino.jwd.MyTask" %> <%@ page import="com.aisino.jwd.Test" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head><title>Simple jsp page</title></head> <body> <% MyTask.setOn(); Test.exe(); %> <a href="on.jsp" mce_href="on.jsp">启动</a> <a href="off.jsp" mce_href="off.jsp">关闭</a> </body> </html>

 

关闭页面 off.jsp

<%@ page import="com.aisino.jwd.MyTask" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head><title>Simple jsp page</title></head> <body> <% MyTask.setOff(); %> <a href="on.jsp" mce_href="on.jsp">启动</a> <a href="off.jsp" mce_href="off.jsp">关闭</a> </body> </html>

 

 写完这个,顺便再来看看Timer吧

 

java.util.Timer定时器,实际上是个线程,定时调度所拥有的TimerTasks。
一个TimerTask实际上就是一个拥有run方法的类,需要定时执行的代码放到run方法体内,TimerTask一般是以匿名类的方式创建。
看看Timer的所有方法

void cancel() 终止此计时器,丢弃所有当前已安排的任务。 int purge() 从此计时器的任务队列中移除所有已取消的任务。 void schedule(TimerTask task, Date time) 安排在指定的时间执行指定的任务。 void schedule(TimerTask task, Date firstTime, long period) 安排指定的任务在指定的时间开始进行重复的固定延迟执行。 void schedule(TimerTask task, long delay) 安排在指定延迟后执行指定的任务。 void schedule(TimerTask task, long delay, long period) 安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。 void scheduleAtFixedRate(TimerTask task, Date firstTime, long period) 安排指定的任务在指定的时间开始进行重复的固定速率执行。 void scheduleAtFixedRate(TimerTask task, long delay, long period) 安排指定的任务在指定的延迟后开始进行重复的固定速率执行。

 

java.util.Timer timer = new java.util.Timer(true); // true 说明这个timer以daemon方式运行(优先级低, // 程序结束timer也自动结束),注意,javax.swing // 包中也有一个Timer类,如果import中用到swing包, // 要注意名字的冲突。 TimerTask task = new TimerTask() { public void run() { ... //每次需要执行的代码放到这里面。 } }; //以下是几种调度task的方法: timer.schedule(task, time); // time为Date类型:在指定时间执行一次。 timer.schedule(task, firstTime, period); // firstTime为Date类型,period为long // 从firstTime时刻开始,每隔period毫秒执行一次。 timer.schedule(task, delay) // delay 为long类型:从现在起过delay毫秒执行一次 timer.schedule(task, delay, period) // delay为long,period为long:从现在起过delay毫秒以后,每隔period // 毫秒执行一次。

 

定时任务:

import java.util.Timer; public class TimerTaskTest extends java.util.TimerTask{ @Override public void run() { // TODO Auto-generated method stub System.out.println("start"); } }

 

测试调用

import java.util.Timer; public class Test { public static void main(String[] args){ Timer timer = new Timer(); timer.schedule(new TimerTaskTest(), 1000, 2000); } }

 

经过以上两个例子,可以结合两者,在前台输入时间 然后控制开启和关闭 这样任务的时间可以改变,同时可控性也得到了很大提高,如果我们不想执行这个任务 我们可以手动去停止它

 

你可能感兴趣的:(Web后台任务定时执行工具的设计与实现)