JFinal定时任务调度问题

由于最近的项目是非Maven项目实现定时任务调度,通过上网查找得知JFinal-ext的jar封装了对Quartz定时器的调用,但是按照操作进行调试,出现找不到com.jfinal.log.Log类的错误信息,后来得知ext没有更新,不过很感谢@JFinal的帮助,用邮箱给我解决方案。下面为解决问题的步骤:

下面链接为项目中需要的jar包和Cron4jPlugin、ITask:http://pan.baidu.com/s/1eSLm9to

步骤如下:

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

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

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

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

  4. cron4j=newCron, registerCron, foreignExchangeCron
    #newCron 
    newCron.cron=* * * * *
    newCron.class=cn.cyansoft.xine.task.NewTask
    newCron.enable=true
    #registerCron
    registerCron.cron=* * * * *
    registerCron.class=cn.cyansoft.xine.task.RegisterTask
    registerCron.enable=true
    #foreignExchange
    foreignExchangeCron.cron=* * * * *
    foreignExchangeCron.class=cn.cyansoft.xine.task.ForeignExchangeTask
    foreignExchangeCron.enable=true
  5. 在继承至JFinalConfig类中的configPlugin,加载配置


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

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

    假定这个MyTask在com.xxx包下        

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

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

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

补充

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

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

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

* 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 的时间点执行

三、若是maven项目用户:

<dependency>
 <groupId>it.sauronsoftware.cron4j</groupId>
 <artifactId>cron4j</artifactId>
 <version>2.2.5</version>
</dependency>


评论区

JFinal

2016-10-15 15:38

@yaoqingqing Cron4jPlugin 有一个无参构造方法,利用 cp = new CronPlugin() 创对象以后,再手动 cp.addTask(...) 逐步进行配置即可,而 cp.addTask(...) 所传入的参数来源可以是任何方式,包括数据库

java_birds

2017-01-12 15:05

@JFinal 在哪里下载呢

精彩飞扬

2017-01-12 18:09

@java_birds http://pan.baidu.com/s/1eSLm9to

精彩飞扬

2017-01-12 18:10

@java_birds 百度云盘共享了

坚强的地瓜

2017-03-04 10:19

@JFinal 问一下 我们项目现在用的2.2的jar包,此功能是不是用不了?我加进去读取那插件的配置,结果项目就运行不起来了

JFinal

2017-03-04 11:32

@坚强的地瓜 这篇贴子就是在 jfinal 3.0 还没发布时发的,所以是一定可以用的,再多试试

坚强的地瓜

2017-03-08 09:18

@JFinal 你好,我的定时配置是 * 9 * * * ,结果到了9点之后,每分钟执行一次,怎么写才是9点只执行一次呀?

坚强的地瓜

2017-03-08 09:31

@坚强的地瓜 已经解决了,是 1 9 * * * 这样吧。。

hmgx

2017-03-20 16:33

@精彩飞扬 你好,我按你的定时任务代码写了,结果什么反应都没有也没有报错,不知道是怎么加事

JFinal

2017-03-20 19:25

@hmgx jfinal 3.0 已经直接支持该功能,参考一下 jfinal 手册有关 cron4j plugin 这一章节

hmgx

2017-03-21 09:17

@JFinal 您好,参照3.0手册上的 这个配置
Cron4jPlugin cp = new Cron4jPlugin();
cp.addTask("* * * * *", new MyTask());
me.add(cp);

public class MyTask implements ITask {
public void run() {
System.out.println("我执行了");
// 这里放被执行的调试任务代码
}

public void stop() {
// 这里的代码会在 task 被关闭前调用
System.out.println("我停止了");
}
}
然后控制台没有输出呢,版本也是3.0的,没有任务反应?

hmgx

2017-03-21 09:29

@JFinal

com.jfinal
jfinal
3.0

这是我的pom依赖,还是需要增加其它的依赖?定时任务没反应

JFinal

2017-03-21 14:54

@hmgx 输出要等到第 0 秒,不是一开启会有反应,cron 表达式为 * * * * * 的含义一定要清楚

hmgx

2017-03-21 19:55

@JFinal * * * * * 为一分钟,然后等一个小时 都没有反应。。。。

JFinal

2017-07-24 10:16

@flower929 改为 2 * * * * 表示每个小时的第 2 分钟开始执行,如果现在时间是 10 点过 3 分,得等 59 分钟才会再执行,具体细节看一下 jfinal 手册有关 Cron4jPlugin 那一章

JJfinal

2017-07-27 11:40

java.lang.NoClassDefFoundError: it/sauronsoftware/cron4j/Scheduler 少了包吗? maven已经粘贴

JJfinal

2017-07-27 12:12

哎 , 搞了一上午 这个方法行不通 换方法了

ts_wh

2017-07-28 10:27

java.lang.NoClassDefFoundError:it/sauronsoftware/cron4j/Scheduler 有这个类为什么汇报这个错啊

ts_wh

2017-07-28 13:28

我如果想要15秒执行一次,怎么下表达式啊

JFinal

2017-07-28 15:51

@ts_wh cron4j plugin 不支持秒,最小只支持到分,具体看一下 jfinal 手册

ts_wh

2017-08-01 09:34

@JFinal 那我要一个秒级的任务怎么处理啊

JFinal

2017-08-01 10:32

@ts_wh 直接用 quartz 这个第三方,cron4j 这个第三方是轻量级的方案,没有支持秒

小船翻翻

2017-08-08 09:31

@happyboy 请问,能写的详细一点吗? 在web项目中的运用。怎么让它跟着服务器启动而启动

2017-08-11 16:06

java.lang.NoClassDefFoundError: it/sauronsoftware/cron4j/Scheduler是什么问题,我按照3.2的文档写的

JFinal

2017-08-11 16:08

@锋 缺包而已,在首页下载 jfinal-3.1-all.zip 这个文件,里面有一个说明文件,指出了 cron4j 需要什么 jar 包

热门分享

扫码入社