歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

JFinal - scheduler 插件做定時任務

我在項目中遇到一個需求:服務運行期間,數據庫要定期去監測某表並且更新。

正好項目是使用 jfinal 做的,於是就用了 jfinal-scheduler 插件來解決(jfinal-scheduler 可以用來做定時任務):

配置插件,在自定義的 JFinalConfig 類中引入此插件:

/**
 * 配置插件
 */
public void configPlugin(Plugins me) {
    // ...
    // 定時器插件
    SchedulerPlugin sp = new SchedulerPlugin();
    Runnable task = new Task();
    sp.fixedRateSchedule(task, 60);
    me.add(sp);
    // ...
}

完善線程

public class Task implements Runnable{
    @Override
    public void run() {
        // DML操作
    }
}

完成上述工作之後,我啟動服務器,發現在 DML 操作之處必現線程阻塞。然而我將這段 DML 操作放到 Controller 中是能夠正常執行並查出數據的。

後來發現原因在這裡:

public class SchedulerPlugin implements IPlugin {

    // ... 
    private final ScheduledThreadPoolExecutor taskScheduler;

    public SchedulerPlugin() {
        this(getBestPoolSize(), null);
    }

    public ScheduledFuture<?> fixedRateSchedule(Runnable task, int periodSeconds) {
        return taskScheduler.scheduleAtFixedRate(task, 0, periodSeconds, TimeUnit.SECONDS);
    }
    
    // ... 
}

在插件調用 fixedRateSchedule(...) 的時候,會調 ScheduledThreadPoolExecutor.scheduleAtFixedRate(...),第二個參數的意思是第一次啟動線程會在多少秒後執行,因為源碼中這個參數是 0,也就是馬上執行的意思,然而此時數據庫還沒有連上呢,查詢操作自然就出異常了。我把 0 改成了 60,果然,1分鐘後,線程啟動,運行正常。

用到的源碼和jar包 myaniu-jfinal-scheduler-master.zip 與 cron4j-2.2.5.zip 下載:

Linux公社資源站下載:

------------------------------------------分割線------------------------------------------

免費下載地址在 http://linux.linuxidc.com/

用戶名與密碼都是www.linuxidc.com

具體下載目錄在 /2016年資料/9月/17日/JFinal - scheduler 插件做定時任務/

下載方法見 http://www.linuxidc.com/Linux/2013-07/87684.htm

------------------------------------------分割線------------------------------------------

Jfinal學習之路---Controller使用 http://www.linuxidc.com/Linux/2014-07/104323.htm

JFinal開發8個常見問題 http://www.linuxidc.com/Linux/2015-02/113421.htm

JFinal的詳細介紹:請點這裡
JFinal的下載地址:請點這裡

Copyright © Linux教程網 All Rights Reserved