一個Java Web後臺任務執行工具的設計與實現
提到後臺任務,最容易想到的恐怕就是Java 中的Timer或者大名鼎鼎的開源定時器Quartz,可是,從本質講,他們都是定時器,以時間間隔嚴格的進行間歇性的執行。
若是要作一個可控制性很強的後臺任務執行工具,Timer和Quartz都不合適。
先看看要求:任務不隨着Web服務器的啓動而啓動,任務的啓動、關閉、重啓都經過Web頁面來控制,任務是後臺的一個線程,一個任務只能用一個線程去執行(單線程隊列式的執行方式),在任務關閉的時候,要等着任務執行完成再關閉,保證任務的執行的完整性。
基於以上的要求:沒有現成的組建或開源的大餅,只能本身手寫了。
分三步:分析、設計、實現。
1、分析
任務是一個線程。------- boolean sw
任務須要開關。------Runnable的靜態變量。
任務在反覆執行。------ while(sw){ do.....}
任務須要經過必定的方式啓動關閉。Test#exe
2、設計
定義一個任務類MyTask,加入開關,並增長設置開關狀態的方法,在run方法中循環執行業務。循環條件以開關爲準。
定義一個啓動任務的工具,好比Test吧,並第一個static方法exe去執行任務,要單線程訪問,設置爲synchronized的。
作三個簡單的頁面,index.jsp/on.jsp/off.jsp來控制任務。(頁面湊合着搞得,不想浪費太多時間,能說明問題便可)。
3、實現
package task;
/**
* 任務
*
* @author leizhimin 2008-12-25 10:37:22
*/
public
class MyTask
extends Thread {
private
static
boolean sw =
false;
public
void run() {
while (sw) {
//進行的全部業務
for (
int i = 0; i < 9999999; i++) ;
System.out.println(
"do------------");
}
}
public
static
void setOn() {
if (sw ==
false) {
System.out.println(
"開關狀態被置爲開!,任務開始執行!");
sw =
true;
}
else {
System.out.println(
"開關已經打開,無須設置!");
}
}
public
static
void setOff() {
if (sw ==
true) {
System.out.println(
"開關關閉,正在執行的任務結束後將終止!");
sw =
false;
}
else {
System.out.println(
"開關已經關閉,無須設置!");
}
}
}
package task;
/**
* 任務的執行工具
*
* @author leizhimin 2008-12-25 10:39:18
*/
public
class Test {
static
int i = 0;
public
synchronized
static
void exe()
throws InterruptedException {
System.out.println(++i);
MyTask myTask =
new MyTask();
myTask.start();
Thread.sleep(100);
}
public
static
void main(String[] args)
throws InterruptedException {
exe();
}
}
index.jsp
<
%@ page
contentType
="text/html;charset=UTF-8"
language
="java" %
>
<
html
>
<
head
>
<
title
>Simple jsp page
</title>
</head>
<
body
>Place your content here
<
a
href
="on.jsp"
>啓動
</a>
<
a
href
="off.jsp"
>關閉
</a>
</body>
</html>
on.jsp
<%@ page import="task.MyTask" %>
<%@ page import="task.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"
>啓動
</a>
<
a
href
="off.jsp"
>關閉
</a>
</body>
</html>
off.jsp
<%@ page import="task.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"
>啓動
</a>
<
a
href
="off.jsp"
>關閉
</a>
</body>
</html>
開關狀態被置爲開!,任務開始執行!
1
do------------
do------------
do------------
do------------
do------------
開關關閉,正在執行的任務結束後將終止!
do------------
從執行結果上看,基本知足了以上的需求,下來要作的就是裝飾了,添加線程池的管理,指定多個任務,完善執行器的控制等等。