2025-02-15

在我們開發的一個系統中,有定時任務,自然就想到瞭Quartz,由於框架采用的Spring,Quartz跟Spring的集成也非常簡單,所以就把Quartz配置到框架中,當系統啟動後,定時任務也就自動啟動。在開發的過程中一直沒有發現問題,但是最後上線的時候,采用的是weblogic cluster,啟動瞭4個節點,發現有的定時任務執行瞭不止一次,才恍然大悟,4個節點啟動瞭4個應用,也就啟動瞭4個定時任務,所以在同一個時間定時任務執行瞭不止一次。去網上搜索,發現Quartz也支持cluster,但是我覺得就我們的系統而言,沒有必要采用cluster的定時任務,也許是比較懶吧,就想讓定時任務隻執行一次。Robbin的解決辦法就是自己單獨啟動一個Job Server,來quartz跑job,不要部署在web容器中。

我也比較同意這個辦法。鑒於時間比較緊,就想有沒有比較方便的方法。其實把原來的webapp當做一個quartz的容器就可以瞭。可以自己寫一個線程來跑應用,再寫一個command啟動這個線程就可以瞭。線程類很簡單,如下:

public class StartServer {

    public static void main(String[] args) throws Exception {

        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(
new String[] { "/spring/context-annotation.xml","/spring/context-transaction.xml",
"/spring/context-hibernate.xml",
"/spring/context-quartz.xml"});

        System.out.println("start server….");

        while (true) {

            try {

                Thread.sleep(900);

            } catch (InterruptedException ex) {

            }

        }

    };

}
 

去掉瞭系統的controller配置servlet.xml,運行這個類就可以瞭。

在web-inf目錄下寫一個command來啟動這個java類:

setlocal ENABLEDELAYEDEXPANSION

if defined CLASSPATH (set CLASSPATH=%CLASSPATH%;.) else (set CLASSPATH=.)

FOR /R .\lib %%G IN (*.jar) DO set CLASSPATH=!CLASSPATH!;%%G

Echo The Classpath definition is==== %CLASSPATH%


set CLASSPATH=./classes;%CLASSPATH%

java com.company.job.StartServer
 

這個command需要把需要的jar(web-inf/lib中)包都放到classpath中。

每次啟動的時候執行這個command就可以瞭。跟原來的應用分開瞭,調試起定時任務也不用影響到原來的應用,還是比較方便的。部署的時候原樣拷貝一份,然後執行這個command就好瞭,部署起來也比較方便。

 作者“菜園子”

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *