jfinal定时任务(Cron4j)

本文介绍如何使用Cron4j配置定时任务,并详细解释了配置文件task.properties的参数意义,包括cron表达式的语法及任务类的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 首先需要项目的jar包,将cron4j-2.2.5.jar放在项目中lib目录下

  2. 将Cron4jPlugin和接口ITask放到项目中,我放在继承至JFinalConfig的类的同包下

  3. 在Cron4j配置文件中设置如下,此文件起名为task.properties,文件中newCron=* * * * *

    表达每分钟执行一次。代码如下:

    1. cron4j=newCron, registerCron, foreignExchangeCron
    2. #newCron 
    3. newCron.cron=* * * * *
    4. newCron.class=cn.cyansoft.xine.task.NewTask
    5. newCron.enable=true
    6. #registerCron
    7. registerCron.cron=* * * * *
    8. registerCron.class=cn.cyansoft.xine.task.RegisterTask
    9. registerCron.enable=true
    10. #foreignExchange
    11. foreignExchangeCron.cron=* * * * *
    12. foreignExchangeCron.class=cn.cyansoft.xine.task.ForeignExchangeTask
    13. foreignExchangeCron.enable=true
  4. 在继承至JFinalConfig类中的configPlugin,加载配置


    1. public void configPlugin(Plugins me) {
    2. me.add(new Cron4jPlugin(PropKit.use("task.properties")));
    3. }
  5. 在任务类中实现ITask接口,在run中写定时任务

    让自己的Task实现ITask杰克,或者实现Runable接口也可以。

    假定这个MyTask在com.xxx包下        

    1. public class MyTask implements ITask {
    2.    public void run() {
    3.       // 这里放被执行的调试任务代码
    4.    }
    5.    
    6.    public void stop() {
    7.      // 这里的代码会在 task 被关闭前调用
    8.    }
    9. }
  6. 到以上为止能够实现定时调度任务,由于我的项目是Jfinal-weixin项目,定时给部分用户发送客服消息,出现如下错误

    http://www.jfinal.com/feedback/138,已反馈并已解决在此反馈中。

    将我解决的方案分享一下,希望能帮到像我一样遇到这样问题的伙伴们。

补充

一、关于定时器配置文件(task.properties)的参数解释:

  1. 以上配置中 cron4j 是入口,后面的 newCron 是任务名称,可以随便起名,这个例子中起的名字是 "newCron"
  2. 一旦起了这个名称,后面的配置就是以这个 "newCron" 打头,例如上面的 newCron.cronnewCron.class等等
  3. newCron.cron=.... 配置调试表达式,具体的含义在 Cron4jPlugin 源代码中有说明,切记:cron 表达式只有五个部分,
  4. taskName.class=... 配置任务的实现类,指向最前面的 MyTask 类,注意类的路径配置正确
  5. taskName.enable=... 配置该任务是否有效,如果为 false,则不会被处理,相当于一个开关变量,这个配置可以省略,省略时默认值为 true
  6. 再说明一点,假定 cron4j=abc 这么配置,那么后面的三个配置如下:
  7. abc.cron=0 * * * *
  8. abc.class=com.xxx.MyTask
  9. abc.enable=true
  10. 最后再被被一点,cron4j 可以同时配置多个任务,以逗号分隔,以下代码同时配置了两个任务
  11. cron4j=taskAaa, taskBbb
  12. taskAaa.cron=0 * * * *
  13. taskAaa.class=com.xxx.TaskOne
  14. taskAaa.enable=true
  15. taskBbb.cron=0 * * * *
  16. taskBbb.class=com.xxx.OtherTask
  17. taskBbb.enable=true

二、以下贴出 Cron4jPlugin 中的部分注释,说明了如何使用:

  1. * cron 表达式由五部分组成:分 * :从 0 59 * :从 0 23 * :从 1 31,字母 L 可以表示月的最后一天 * :从 1 12,可以别名:jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov" and "dec" * 周 :从 0 到 6,0 表示周日,6 表示周六,可以使用别名: "sun", "mon", "tue", "wed", "thu", "fri" and "sat" * * 数字 n:表示一个具体的时间点,例如 5 * * * * 表示 5 分这个时间点时执行 * 逗号 , :表示指定多个数值,例如 3,5 * * * * 表示 3 和 5 分这两个时间点执行 * 减号 -:表示范围,例如 1-3 * * * * 表示 1 分、2 分再到 3 分这三个时间点执行 * 星号 *:表示每一个时间点,例如 * * * * * 表示每分钟执行 * 除号 /:表示指定一个值的增加幅度。例如 n/m表示从 n 开始,每次增加 m 的时间点执行
JFinal 框架本身没有提供定时任务功能,但是可以通过集成第三方库来实现定时任务。下面介绍两种实现方式: 1. 使用Quartz定时任务 Quartz 是一个开源的 Java 定时任务框架,可以实现复杂的定时任务调度。在 JFinal 框架中使用 Quartz 可以通过以下步骤实现: 1. 引入 Quartz 依赖 在 pom.xml 文件中添加以下依赖: ```xml <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version> </dependency> ``` 2. 编写定时任务类 ```java public class MyJob implements Job { public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println("Hello World!"); } } ``` 3. 配置定时任务JFinal 的配置文件中添加以下代码: ```java public class DemoConfig extends JFinalConfig { public void configConstant(Constants me) { // ... } public void configRoute(Routes me) { // ... } public void configPlugin(Plugins me) { // ... } public void configInterceptor(Interceptors me) { // ... } public void configHandler(Handlers me) { // ... } public void afterJFinalStart() { try { // 创建 Scheduler SchedulerFactory sf = new StdSchedulerFactory(); Scheduler sched = sf.getScheduler(); // 创建 JobDetail JobDetail job = JobBuilder.newJob(MyJob.class) .withIdentity("myJob", "group1") .build(); // 创建 Trigger Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("myTrigger", "group1") .startNow() .withSchedule(simpleSchedule() .withIntervalInSeconds(10) .repeatForever()) .build(); // 将 JobDetail 和 Trigger 添加到 Scheduler 中 sched.scheduleJob(job, trigger); // 启动 Scheduler sched.start(); } catch (SchedulerException e) { e.printStackTrace(); } } } ``` 以上代码会在 JFinal 启动后创建一个定时任务,每隔 10 秒钟打印一次 "Hello World!"。 2. 使用ScheduledExecutorService定时任务 ScheduledExecutorService 是 Java 提供的一个定时任务调度器,可以很方便地实现简单的定时任务。在 JFinal 框架中使用 ScheduledExecutorService 可以通过以下步骤实现: 1. 编写定时任务类 ```java public class MyTask implements Runnable { public void run() { System.out.println("Hello World!"); } } ``` 2. 配置定时任务JFinal 的配置文件中添加以下代码: ```java public class DemoConfig extends JFinalConfig { public void configConstant(Constants me) { // ... } public void configRoute(Routes me) { // ... } public void configPlugin(Plugins me) { // ... } public void configInterceptor(Interceptors me) { // ... } public void configHandler(Handlers me) { // ... } public void afterJFinalStart() { ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); scheduler.scheduleAtFixedRate(new MyTask(), 0, 10, TimeUnit.SECONDS); } } ``` 以上代码会在 JFinal 启动后创建一个定时任务,每隔 10 秒钟打印一次 "Hello World!"。 注意事项: 1. 定时任务需要在 JFinal 启动后创建,因此需要在 afterJFinalStart() 方法中配置定时任务。 2. 如果使用 Quartz 定时任务,需要在 JFinal 启动前初始化 Quartz,否则会出现 "Scheduler is not started" 的错误。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值