我在項目中遇到一個需求:服務運行期間,數據庫要定期去監測某表並且更新。
正好項目是使用 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的下載地址:請點這裡