数据库加载定时任务Cron4jPlugin

按照大佬分享的定时任务调度,加入从数据库加载定时任务JFinal使用技巧-动态管理任务调度  

  1. 插件 MyCron4jPlugin,启动的时候从数据库加载任务

public class MyCron4jPlugin extends Cron4jPlugin {
    @Override
    public boolean start() {
        loadTasksFromDb();
        Cron4jKit.start();
        System.out.println("加载定时任务插件并启动....");
        return true;
    }
    @Override
    public boolean stop() {
        Cron4jKit.stop();
        return true;
    }

    /**
     * 从数据库加载任务
     */
    public void loadTasksFromDb() {
        try {
            List<SxSysRunnable> runnableList = SxSysRunnable.me.list();
            for (SxSysRunnable t:runnableList) {
                Object jobObj = Class.forName(t.getStr("class_name")).newInstance();
                Cron4jKit.put(t.getStr("config_name"),t.getStr("cron"),true,(Runnable) jobObj);
                System.out.println("加载定时器:"+t.getStr("class_name"));
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
    }
}
2.RUNNABLE 表结构
create table T_SUP_RUNNABLE
(
    ID  VARCHAR2(64) default sys_guid() not null
        constraint T_SUP_RUNNABLE_PK
            primary key,
    NAME          VARCHAR2(64),
    CONFIG_NAME   VARCHAR2(64),
    CRON          VARCHAR2(128),
    CLASS_NAME    VARCHAR2(64),
    STATUS        NCHAR(1),
    END_RUN_TIME  DATE         default sysdate,
    RUN_COUNT     NUMBER       default 0
)
/

comment on table T_SUP_RUNNABLE is '定时任务'
/

comment on column T_SUP_RUNNABLE.NAME is '任务名'
/

comment on column T_SUP_RUNNABLE.CONFIG_NAME is '任务标识'
/

comment on column T_SUP_RUNNABLE.CRON is '定时任务表达式'
/

comment on column T_SUP_RUNNABLE.CLASS_NAME is '类名'
/

comment on column T_SUP_RUNNABLE.STATUS is '状态'
/

comment on column T_SUP_RUNNABLE.RUN_COUNT is '执行次数'
/


评论区

JFinal

2025-05-28 22:15

收藏一波,后面用上,谢谢分享

scocai

2025-06-30 11:22

SxSysRunnable 这个表结构可否提供一下?

2025-06-30 13:45

@scocai 已补充到文中

杜福忠

2025-06-30 15:40

@谢 赞!以前分享这个小工具时,都没想到写这个内容!相当好的分享。
PS:工具类里面有 Runnable newRunnable(String className) 这个反射方法。可以使用它,记得以前同事有老写继承ITask接口的任务,总报错😂。。。
我们也是使用的类似方式,有增加一个json参数任务类接口,数据库里面可以存储参数用于一个任务类可支持一些业务逻辑的配置。以及任务的运行状态判断用于集群部署时防重复执行。

热门分享

扫码入社