开发者社区> 问答> 正文

自定义Jfinal Quartz插件报错org.quartz.CronSched?报错

因为项目需要动态管理quartz的任务调度,所以参考了http://my.oschina.net/u/147181/blog/664223文章里的内容,自定义了一个quartz的插件类,但是在程序启动的时候,总是提示如下错误:

后来发现即便我把原来quartz插件代码拷贝过来用一样会报错,直接使用jfinal-ext2包中的插件就不会报错,这到底是什么情况啊,郁闷死了,求大神们,帮忙看看。

开发环境:jfinal2.2,jfinal-ext2 2.0.5,quartz 2.2.1


2016-07-07 15:46:27
[ERROR]-[Thread: main]-[com.jfinal.core.Config.startPlugins()]: Plugin start error: apache_app.core.MyQuartzPlugin. 
org.quartz.CronScheduleBuilder cannot be cast to [Ljava.lang.Object;
java.lang.ClassCastException: org.quartz.CronScheduleBuilder cannot be cast to [Ljava.lang.Object;
  at apache_app.core.MyQuartzPlugin.startJobs(MyQuartzPlugin.java:90)
  at apache_app.core.MyQuartzPlugin.start(MyQuartzPlugin.java:56)
  at com.jfinal.core.Config.startPlugins(Config.java:88)
  at com.jfinal.core.Config.configJFinal(Config.java:49)
  at com.jfinal.core.JFinal.init(JFinal.java:62)
  at com.jfinal.core.JFinalFilter.init(JFinalFilter.java:49)
  at org.eclipse.jetty.servlet.FilterHolder.doStart(FilterHolder.java:119)
  at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64)
  at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:724)
  at org.eclipse.jetty.servlet.ServletContextHandler.startContext(Servl




展开
收起
爱吃鱼的程序员 2020-06-09 13:26:57 752 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    用一下cron4j插件, Cron4jPlugin代码如下:

    publicclassCron4jPluginimplementsIPlugin{privateList<TaskInfo>taskInfoList=newArrayList<TaskInfo>();publicstaticfinalStringdefaultConfigName="cron4j";publicCron4jPlugin(){}publicCron4jPlugin(StringconfigFile){this(newProp(configFile),defaultConfigName);}publicCron4jPlugin(PropconfigProp){this(configProp,defaultConfigName);}publicCron4jPlugin(StringconfigFile,StringconfigName){this(newProp(configFile),configName);}publicCron4jPlugin(PropconfigProp,StringconfigName){try{addTask(configProp,configName);}catch(RuntimeExceptione){throwe;}catch(Exceptione){thrownewRuntimeException(e);}}privatevoidaddTask(PropconfigProp,StringconfigName)throwsException{StringconfigNameValue=configProp.get(configName);if(StrKit.isBlank(configNameValue)){thrownewIllegalArgumentException("ThevalueofconfigName:"+configName+"cannotbeblank.");}String[]taskNameArray=configNameValue.trim().split(",");for(StringtaskName:taskNameArray){if(StrKit.isBlank(taskName)){thrownewIllegalArgumentException("taskNamecannotbeblank.");}taskName=taskName.trim();StringtaskCron=configProp.get(taskName+".cron");if(StrKit.isBlank(taskCron)){thrownewIllegalArgumentException(taskName+".cron"+"notfound.");}taskCron=taskCron.trim();StringtaskClass=configProp.get(taskName+".class");if(StrKit.isBlank(taskClass)){thrownewIllegalArgumentException(taskName+".class"+"notfound.");}taskClass=taskClass.trim();ObjecttaskObj=Class.forName(taskClass).newInstance();if(!(taskObjinstanceofRunnable)&&!(taskObjinstanceofTask)){thrownewIllegalArgumentException("Task必须是Runnable、ITask、ProcessTask或者Task类型");}booleantaskDaemon=configProp.getBoolean(taskName+".daemon",true);booleantaskEnable=configProp.getBoolean(taskName+".enable",true);taskInfoList.add(newTaskInfo(taskCron,taskObj,taskDaemon,taskEnable));}}publicCron4jPluginaddTask(Stringcron,Runnabletask,booleandaemon,booleanenable){taskInfoList.add(newTaskInfo(cron,task,daemon,enable));returnthis;}publicCron4jPluginaddTask(Stringcron,Runnabletask,booleandaemon){returnaddTask(cron,task,daemon,true);}publicCron4jPluginaddTask(Stringcron,Runnabletask){returnaddTask(cron,task,true,true);}publicCron4jPluginaddTask(Stringcron,ProcessTaskprocessTask,booleandaemon,booleanenable){taskInfoList.add(newTaskInfo(cron,processTask,daemon,enable));returnthis;}publicCron4jPluginaddTask(Stringcron,ProcessTaskprocessTask,booleandaemon){returnaddTask(cron,processTask,daemon,true);}publicCron4jPluginaddTask(Stringcron,ProcessTaskprocessTask){returnaddTask(cron,processTask,true,true);}publicCron4jPluginaddTask(Stringcron,Tasktask,booleandaemon,booleanenable){taskInfoList.add(newTaskInfo(cron,task,daemon,enable));returnthis;}publicCron4jPluginaddTask(Stringcron,Tasktask,booleandaemon){returnaddTask(cron,task,daemon,true);}publicCron4jPluginaddTask(Stringcron,Tasktask){returnaddTask(cron,task,true,true);}publicbooleanstart(){for(TaskInfotaskInfo:taskInfoList){taskInfo.schedule();}for(TaskInfotaskInfo:taskInfoList){taskInfo.start();}returntrue;}publicbooleanstop(){for(TaskInfotaskInfo:taskInfoList){taskInfo.stop();}returntrue;}privatestaticclassTaskInfo{Schedulerscheduler;Stringcron;Objecttask;booleandaemon;booleanenable;TaskInfo(Stringcron,Objecttask,booleandaemon,booleanenable){if(StrKit.isBlank(cron)){thrownewIllegalArgumentException("cron不能为空.");}if(task==null){thrownewIllegalArgumentException("task不能为null.");}this.cron=cron.trim();this.task=task;this.daemon=daemon;this.enable=enable;}voidschedule(){if(enable){scheduler=newScheduler();if(taskinstanceofRunnable){scheduler.schedule(cron,(Runnable)task);}elseif(taskinstanceofTask){scheduler.schedule(cron,(Task)task);}else{scheduler=null;thrownewIllegalStateException("Task必须是Runnable、ITask、ProcessTask或者Task类型");}scheduler.setDaemon(daemon);}}voidstart(){if(enable){scheduler.start();}}voidstop(){if(enable){if(taskinstanceofITask){((ITask)task).stop();}scheduler.stop();}}}}

      ITask文件内容如下:

    /***实现ITask接口的Task,多了一个stop方法,插件在停止时会进行回调*/publicinterfaceITaskextendsRunnable{abstractvoidstop();}

     使用方法:

    1:添加依赖

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

    2:在YourJFinal中添加插件

    me.add(newCron4jPlugin("cron4jConfig.txt"));

    3:在cron4jConfig.txt中添加配置

    #cron4j任务调度配置cron4j=myTaskmyTask.cron=0****myTask.class=xxx.com.XxxTaskmyTask.enable=true4:让xxx.com.XxxTask实现Runnable接口,或者ITask接口也可以,cron表达式可以精确指定调度规则,记住cron4j的cron表达式只有五部分:分(0-59)、小时(0-23)、天(1-31)、月(1-12)、周(0-6)其中0表示周日,6表示周六回复 @冰小块:你参考写了一个插件,然后报了一个类型转换异常,并没有贴出任何源代码,相当于让回答者蒙上眼猜孕妇肚子里孩子的性别,所以我给出另一个方案来得实际点,你参考这个方案应该不会出错^_^波总,你这个方案只是让我换一个插件用啊,并没有解决我实际上的困惑。我如果直接使用jfinal-ext2扩展包中quartz插件是完全没有问题,只是在自己写插件的时候报错了,并且就算把扩展包中插件的源码原封不动的拷贝到我自己的类里一样会报错。感谢波总的回答,一会儿去试一下。

    引用来自“JFinal”的评论

    用一下cron4j插件, Cron4jPlugin代码如下:

    publicclassCron4jPluginimplementsIPlugin{privateList<TaskInfo>taskInfoList=newArrayList<TaskInfo>();publicstaticfinalStringdefaultConfigName="cron4j";publicCron4jPlugin(){}publicCron4jPlugin(StringconfigFile){this(newProp(configFile),defaultConfigName);}publicCron4jPlugin(PropconfigProp){this(configProp,defaultConfigName);}publicCron4jPlugin(StringconfigFile,StringconfigName){this(newProp(configFile),configName);}publicCron4jPlugin(PropconfigProp,StringconfigName){try{addTask(configProp,configName);}catch(RuntimeExceptione){throwe;}catch(Exceptione){thrownewRuntimeException(e);}}privatevoidaddTask(PropconfigProp,StringconfigName)throwsException{StringconfigNameValue=configProp.get(configName);if(StrKit.isBlank(configNameValue)){thrownewIllegalArgumentException("ThevalueofconfigName:"+configName+"cannotbeblank.");}String[]taskNameArray=configNameValue.trim().split(",");for(StringtaskName:taskNameArray){if(StrKit.isBlank(taskName)){thrownewIllegalArgumentException("taskNamecannotbeblank.");}taskName=taskName.trim();StringtaskCron=configProp.get(taskName+".cron");if(StrKit.isBlank(taskCron)){thrownewIllegalArgumentException(taskName+".cron"+"notfound.");}taskCron=taskCron.trim();StringtaskClass=configProp.get(taskName+".class");if(StrKit.isBlank(taskClass)){thrownewIllegalArgumentException(taskName+".class"+"notfound.");}taskClass=taskClass.trim();ObjecttaskObj=Class.forName(taskClass).newInstance();if(!(taskObjinstanceofRunnable)&&!(taskObjinstanceofTask)){thrownewIllegalArgumentException("Task必须是Runnable、ITask、ProcessTask或者Task类型");}booleantaskDaemon=configProp.getBoolean(taskName+".daemon",true);booleantaskEnable=configProp.getBoolean(taskName+".enable",true);taskInfoList.add(newTaskInfo(taskCron,taskObj,taskDaemon,taskEnable));}}publicCron4jPluginaddTask(Stringcron,Runnabletask,booleandaemon,booleanenable){taskInfoList.add(newTaskInfo(cron,task,daemon,enable));returnthis;}publicCron4jPluginaddTask(Stringcron,Runnabletask,booleandaemon){returnaddTask(cron,task,daemon,true);}publicCron4jPluginaddTask(Stringcron,Runnabletask){returnaddTask(cron,task,true,true);}publicCron4jPluginaddTask(Stringcron,ProcessTaskprocessTask,booleandaemon,booleanenable){taskInfoList.add(newTaskInfo(cron,processTask,daemon,enable));returnthis;}publicCron4jPluginaddTask(Stringcron,ProcessTaskprocessTask,booleandaemon){returnaddTask(cron,processTask,daemon,true);}publicCron4jPluginaddTask(Stringcron,ProcessTaskprocessTask){returnaddTask(cron,processTask,true,true);}publicCron4jPluginaddTask(Stringcron,Tasktask,booleandaemon,booleanenable){taskInfoList.add(newTaskInfo(cron,task,daemon,enable));returnthis;}publicCron4jPluginaddTask(Stringcron,Tasktask,booleandaemon){returnaddTask(cron,task,daemon,true);}publicCron4jPluginaddTask(Stringcron,Tasktask){returnaddTask(cron,task,true,true);}publicbooleanstart(){for(TaskInfotaskInfo:taskInfoList){taskInfo.schedule();}for(TaskInfotaskInfo:taskInfoList){taskInfo.start();}returntrue;}publicbooleanstop(){for(TaskInfotaskInfo:taskInfoList){taskInfo.stop();}returntrue;}privatestaticclassTaskInfo{Schedulerscheduler;Stringcron;Objecttask;booleandaemon;booleanenable;TaskInfo(Stringcron,Objecttask,booleandaemon,booleanenable){if(StrKit.isBlank(cron)){thrownewIllegalArgumentException("cron不能为空.");}if(task==null){thrownewIllegalArgumentException("task不能为null.");}this.cron=cron.trim();this.task=task;this.daemon=daemon;this.enable=enable;}voidschedule(){if(enable){scheduler=newScheduler();if(taskinstanceofRunnable){scheduler.schedule(cron,(Runnable)task);}elseif(taskinstanceofTask){scheduler.schedule(cron,(Task)task);}else{scheduler=null;thrownewIllegalStateException("Task必须是Runnable、ITask、ProcessTask或者Task类型");}scheduler.setDaemon(daemon);}}voidstart(){if(enable){scheduler.start();}}voidstop(){if(enable){if(taskinstanceofITask){((ITask)task).stop();}scheduler.stop();}}}}

      ITask文件内容如下:

    /***实现ITask接口的Task,多了一个stop方法,插件在停止时会进行回调*/publicinterfaceITaskextendsRunnable{abstractvoidstop();}

     使用方法:

    1:添加依赖

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

    2:在YourJFinal中添加插件

    me.add(newCron4jPlugin("cron4jConfig.txt"));

    3:在cron4jConfig.txt中添加配置

    #cron4j任务调度配置cron4j=myTaskmyTask.cron=0****myTask.class=xxx.com.XxxTaskmyTask.enable=true4:让xxx.com.XxxTask实现Runnable接口,或者ITask接口也可以,cron表达式可以精确指定调度规则,记住cron4j的cron表达式只有五部分:分(0-59)、小时(0-23)、天(1-31)、月(1-12)、周(0-6)其中0表示周日,6表示周六
    2020-06-09 13:27:14
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Java Spring Boot开发实战系列课程【第6讲】:Spring Boot 2.0实战MyBatis与优化(Java面试题) 立即下载
Java Spring Boot开发实战系列课程【第15讲】:Spring Boot 2.0 API与Spring REST Docs实战 立即下载
杜万-Java reactive programming - Reactor 3 and Spring WebFlux 立即下载