jfinal-ext + quartz2.2.2 使用时出现问题

我为了修改QuartzPlugin里面加载配置文件的逻辑,改为直接读取日期以方便配合我的项目逻辑。新建一个NewQuartPlugin复制并修改QuartPlugin代码如下(添加了loadProperties方法,修改start里面的配置文件方法为loadProperties方法):

@Override
public boolean start() {
    loadProperties(); // 加载配置文件键改为这个方法
    startJobs();
    return true;
}

private void loadJobsFromProperties() {
    if (StrKit.isBlank(jobConfig)) {
        return;
    }
    jobProp = ResourceKit.readProperties(jobConfig);
    Set<Map.Entry<String, String>> entries = jobProp.entrySet();
    for (Map.Entry<String, String> entry : entries) {
        String key = entry.getKey();
        if (!key.endsWith(JOB) || !isEnableJob(enable(key))) {
            continue;
        }
        String jobClassName = jobProp.get(key) + "";
        String jobCronExp = jobProp.get(cronKey(key)) + "";
        Class<Job> job = Reflect.on(jobClassName).get();
        try {
            jobs.put(job.newInstance(), jobCronExp);
        } catch (Exception e) {
            Throwables.propagate(e);
        }
    }
}

private void loadProperties() {
    String jobClassName = "jfinal.common.Last30MinJob";
    // 获取cron表达式
    DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
    DateTime dateTime = DateTime.parse(GlobalVariables.END_TIME_STRING, dateTimeFormatter).minusMinutes(30);
    String jobCronExp = TimeUtil.formaterCronExpression(dateTime);
    Class<Job> job = Reflect.on(jobClassName).get();

    logger.info("job " + jobClassName + " has scheduled based on cron " + jobCronExp);

    try {
        jobs.put(job.newInstance(), jobCronExp);
    } catch (Exception e) {
        Throwables.propagate(e);
    }
}

然后报错:

[ERROR]-[Thread: RMI TCP Connection(3)-127.0.0.1]-[com.jfinal.core.Config.startPlugins()]: Plugin start error: jfinal.common.NewQuartzPlugin. 
org.quartz.CronScheduleBuilder cannot be cast to [Ljava.lang.Object;
java.lang.ClassCastException: org.quartz.CronScheduleBuilder cannot be cast to [Ljava.lang.Object;
	at jfinal.common.NewQuartzPlugin.startJobs(NewQuartzPlugin.java:93)
	at jfinal.common.NewQuartzPlugin.start(NewQuartzPlugin.java:61)
	at com.jfinal.core.Config.startPlugins(Config.java:87)
	at com.jfinal.core.Config.configJFinal(Config.java:48)
	at com.jfinal.core.JFinal.init(JFinal.java:65)
	at com.jfinal.core.JFinalFilter.init(JFinalFilter.java:49)
	at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:279)
	at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:260)
	at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:105)
	at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4590)
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5233)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
	at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:752)
	at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:728)
	at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734)
	at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1702)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300)
	at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)

我按照http://blog.csdn.net/sushengmiyan/article/details/52703435中的方法修改startJobs中的逻辑后报错:

[ERROR]-[Thread: RMI TCP Connection(3)-127.0.0.1]-[com.jfinal.core.Config.startPlugins()]: Plugin start error: jfinal.common.NewQuartzPlugin. 
java.lang.reflect.InvocationTargetException
com.jfinal.ext.kit.ReflectException: java.lang.reflect.InvocationTargetException
	at com.jfinal.ext.kit.Reflect.on(Reflect.java:650)
	at com.jfinal.ext.kit.Reflect.call(Reflect.java:383)
	at jfinal.common.NewQuartzPlugin.startJobs(NewQuartzPlugin.java:100)
	at jfinal.common.NewQuartzPlugin.start(NewQuartzPlugin.java:62)
	at com.jfinal.core.Config.startPlugins(Config.java:87)
	at com.jfinal.core.Config.configJFinal(Config.java:48)

不知该怎么办了,其实我的要求很简单,就是在某一个时间点执行一次任务就行了,但是用这个QuartzPlugin必须要用到job.properties配置文件,导致在测试的时候很麻烦,经常要改动两个文件!请问大神怎么弄?

当我正常使用的时候却没有报错:

QuartzPlugin quartzPlugin = new QuartzPlugin("job.properties");
me.add(quartzPlugin);

job.properties文件:

a.job=jfinal.common.Last30MinJob
# a.cron=03 00 16 23 9 ? 2017
a.cron=03 00 14 * * ? 2017
a.enable=true


评论区

weirdor

2017-08-18 15:16

JFinal

2017-08-18 16:26

直接用一下 jfinal 中的 Cron4jPlugin,具体用法在手册中有详细的说明

quartz 与 jfinal-ext 没有用过,没法给到建议

Harlan1994

2017-08-18 17:36

@JFinal 我也用过Cron4jPlugin,但是一直报错,http://www.jfinal.com/feedback/1875, 麻烦看看是什么问题!

热门反馈

扫码入社