首页 > 代码库 > JFinal - scheduler 插件做定时任务

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);    }        // ... }

在定时器插件调用这个方法的时候,会调 ScheduledThreadPoolExecutor 的 scheduleAtFixedRate 方法,第二个参数的意思是第一次启动线程会在多少秒后执行,因为源码中这个参数是 0,也就是马上执行的意思,然而此时数据库还没有连上呢,查询操作自然就出异常了。

 

用到的源码和jar包:

myaniu-jfinal-scheduler-master.zip

cron4j-2.2.5.zip

 

JFinal - scheduler 插件做定时任务