JFinal - scheduler 插件做定时任务

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 插件做定时任务的主要内容,如果未能解决你的问题,请参考以下文章

Jfinal QuartzPlugin 简单使用案例

SpringBoot之scheduled定时器

KingbaseES数据库 kdb_schedule 自动定时任务

KingbaseES数据库 kdb_schedule 自动定时任务

wordpress定时发布失败Missed Schedule解决方法

Springboot之使用Scheduled做定时任务