一個Java Web後臺任務執行工具的設計與實現

一個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------------
 
從執行結果上看,基本知足了以上的需求,下來要作的就是裝飾了,添加線程池的管理,指定多個任務,完善執行器的控制等等。
相關文章
相關標籤/搜索