自定义Jfinal Quartz插件报错org.quartz.CronScheduleBuilder cannot be cast to [Ljava.lang.Object

发布于 2021-11-29 14:51:54 字数 1477 浏览 895 评论 5

因为项目需要动态管理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




如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

檐上三寸雪 2021-12-04 17:41:03

引用来自“JFinal”的评论

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

public class Cron4jPlugin implements IPlugin {
	
	private List<TaskInfo> taskInfoList = new ArrayList<TaskInfo>();
	public static final String defaultConfigName = "cron4j";

	public Cron4jPlugin() {

	}
	
	public Cron4jPlugin(String configFile) {
		this(new Prop(configFile), defaultConfigName);
	}
	
	public Cron4jPlugin(Prop configProp) {
		this(configProp, defaultConfigName);
	}

	public Cron4jPlugin(String configFile, String configName) {
		this(new Prop(configFile), configName);
	}
	
	public Cron4jPlugin(Prop configProp, String configName) {
		try {
			addTask(configProp, configName);
		} catch (RuntimeException e) {
			throw e;
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	private void addTask(Prop configProp, String configName) throws Exception {
		String configNameValue = configProp.get(configName);
		if (StrKit.isBlank(configNameValue)) {
			throw new IllegalArgumentException("The value of configName: " + configName + " can not be blank.");
		}
		String[] taskNameArray = configNameValue.trim().split(",");
		for (String taskName : taskNameArray) {
			if (StrKit.isBlank(taskName)) {
				throw new IllegalArgumentException("taskName can not be blank.");
			}
			taskName = taskName.trim();

			String taskCron = configProp.get(taskName + ".cron");
			if (StrKit.isBlank(taskCron)) {
				throw new IllegalArgumentException(taskName + ".cron" + " not found.");
			}
			taskCron = taskCron.trim();

			String taskClass = configProp.get(taskName + ".class");
			if (StrKit.isBlank(taskClass)) {
				throw new IllegalArgumentException(taskName + ".class" + " not found.");
			}
			taskClass = taskClass.trim();

			Object taskObj = Class.forName(taskClass).newInstance();
			if ( !(taskObj instanceof Runnable) && !(taskObj instanceof Task) ) {
				throw new IllegalArgumentException("Task 必须是 Runnable、ITask、ProcessTask 或者 Task 类型");
			}

			boolean taskDaemon  = configProp.getBoolean(taskName + ".daemon", true);
			boolean taskEnable  = configProp.getBoolean(taskName + ".enable", true);
			taskInfoList.add(new TaskInfo(taskCron, taskObj, taskDaemon, taskEnable));
		}
	}

	public Cron4jPlugin addTask(String cron, Runnable task, boolean daemon, boolean enable) {
		taskInfoList.add(new TaskInfo(cron, task, daemon, enable));
		return this;
	}

	public Cron4jPlugin addTask(String cron, Runnable task, boolean daemon) {
		return addTask(cron, task, daemon, true);
	}

	public Cron4jPlugin addTask(String cron, Runnable task) {
		return addTask(cron, task, true, true);
	}

	public Cron4jPlugin addTask(String cron, ProcessTask processTask, boolean daemon, boolean enable) {
		taskInfoList.add(new TaskInfo(cron, processTask, daemon, enable));
		return this;
	}

	public Cron4jPlugin addTask(String cron, ProcessTask processTask, boolean daemon) {
		return addTask(cron, processTask, daemon, true);
	}

	public Cron4jPlugin addTask(String cron, ProcessTask processTask) {
		return addTask(cron, processTask, true, true);
	}

	public Cron4jPlugin addTask(String cron, Task task, boolean daemon, boolean enable) {
		taskInfoList.add(new TaskInfo(cron, task, daemon, enable));
		return this;
	}

	public Cron4jPlugin addTask(String cron, Task task, boolean daemon) {
		return addTask(cron, task, daemon, true);
	}

	public Cron4jPlugin addTask(String cron, Task task) {
		return addTask(cron, task, true, true);
	}
	
	public boolean start() {
		for (TaskInfo taskInfo : taskInfoList) {
			taskInfo.schedule();
		}
		for (TaskInfo taskInfo : taskInfoList) {
			taskInfo.start();
		}
		return true;
	}
	
	public boolean stop() {
		for (TaskInfo taskInfo : taskInfoList) {
			taskInfo.stop();
		}
		return true;
	}
	
	private static class TaskInfo {
		Scheduler scheduler;

		String cron;
		Object task;
		boolean daemon;
		boolean enable;

		TaskInfo(String cron, Object task, boolean daemon, boolean enable) {
			if (StrKit.isBlank(cron)) {
				throw new IllegalArgumentException("cron 不能为空.");
			}
			if (task == null) {
				throw new IllegalArgumentException("task 不能为 null.");
			}

			this.cron = cron.trim();
			this.task = task;
			this.daemon = daemon;
			this.enable = enable;
		}

		void schedule() {
			if (enable) {
				scheduler = new Scheduler();
				if (task instanceof Runnable) {
					scheduler.schedule(cron, (Runnable) task);
				} else if (task instanceof Task) {
					scheduler.schedule(cron, (Task) task);
				} else {
					scheduler = null;
					throw new IllegalStateException("Task 必须是 Runnable、ITask、ProcessTask 或者 Task 类型");
				}
				scheduler.setDaemon(daemon);
			}
		}

		void start() {
			if (enable) {
				scheduler.start();
			}
		}

		void stop() {
			if (enable) {
				if (task instanceof ITask) {
					((ITask)task).stop();
				}
				scheduler.stop();
			}
		}
	}
}

    ITask 文件内容如下:

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

  使用方法:

1:添加依赖

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

2:在 YourJFinal 中添加插件

me.add(new Cron4jPlugin("cron4jConfig.txt"));

3:在 cron4jConfig.txt 中添加配置

# cron4j 任务调度配置
cron4j=myTask
myTask.cron=0 * * * *
myTask.class=xxx.com.XxxTask
myTask.enable=true

4:让 xxx.com.XxxTask 实现 Runnable 接口,或者ITask 接口也可以,cron 表达式可以精确指定调度规则,记住 cron4j 的cron 表达式只有五部分:分(0-59)、小时(0-23)、天(1-31)、月(1-12)、周(0-6)其中0表示周日,6表示周六

千笙结 2021-12-04 17:41:01

感谢波总的回答,一会儿去试一下。

辞别 2021-12-04 16:18:08

波总,你这个方案只是让我换一个插件用啊,并没有解决我实际上的困惑。我如果直接使用jfinal-ext2扩展包中quartz插件是完全没有问题,只是在自己写插件的时候报错了,并且就算把扩展包中插件的源码原封不动的拷贝到我自己的类里一样会报错。

柳若烟 2021-12-04 14:36:03

回复
你参考写了一个插件,然后报了一个类型转换异常,并没有贴出任何源代码,相当于让回答者蒙上眼猜孕妇肚子里孩子的性别,所以我给出另一个方案来得实际点,你参考这个方案应该 不会出错 ^_^

灵芸 2021-11-30 03:33:37

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

public class Cron4jPlugin implements IPlugin {
	
	private List<TaskInfo> taskInfoList = new ArrayList<TaskInfo>();
	public static final String defaultConfigName = "cron4j";

	public Cron4jPlugin() {

	}
	
	public Cron4jPlugin(String configFile) {
		this(new Prop(configFile), defaultConfigName);
	}
	
	public Cron4jPlugin(Prop configProp) {
		this(configProp, defaultConfigName);
	}

	public Cron4jPlugin(String configFile, String configName) {
		this(new Prop(configFile), configName);
	}
	
	public Cron4jPlugin(Prop configProp, String configName) {
		try {
			addTask(configProp, configName);
		} catch (RuntimeException e) {
			throw e;
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	private void addTask(Prop configProp, String configName) throws Exception {
		String configNameValue = configProp.get(configName);
		if (StrKit.isBlank(configNameValue)) {
			throw new IllegalArgumentException("The value of configName: " + configName + " can not be blank.");
		}
		String[] taskNameArray = configNameValue.trim().split(",");
		for (String taskName : taskNameArray) {
			if (StrKit.isBlank(taskName)) {
				throw new IllegalArgumentException("taskName can not be blank.");
			}
			taskName = taskName.trim();

			String taskCron = configProp.get(taskName + ".cron");
			if (StrKit.isBlank(taskCron)) {
				throw new IllegalArgumentException(taskName + ".cron" + " not found.");
			}
			taskCron = taskCron.trim();

			String taskClass = configProp.get(taskName + ".class");
			if (StrKit.isBlank(taskClass)) {
				throw new IllegalArgumentException(taskName + ".class" + " not found.");
			}
			taskClass = taskClass.trim();

			Object taskObj = Class.forName(taskClass).newInstance();
			if ( !(taskObj instanceof Runnable) && !(taskObj instanceof Task) ) {
				throw new IllegalArgumentException("Task 必须是 Runnable、ITask、ProcessTask 或者 Task 类型");
			}

			boolean taskDaemon  = configProp.getBoolean(taskName + ".daemon", true);
			boolean taskEnable  = configProp.getBoolean(taskName + ".enable", true);
			taskInfoList.add(new TaskInfo(taskCron, taskObj, taskDaemon, taskEnable));
		}
	}

	public Cron4jPlugin addTask(String cron, Runnable task, boolean daemon, boolean enable) {
		taskInfoList.add(new TaskInfo(cron, task, daemon, enable));
		return this;
	}

	public Cron4jPlugin addTask(String cron, Runnable task, boolean daemon) {
		return addTask(cron, task, daemon, true);
	}

	public Cron4jPlugin addTask(String cron, Runnable task) {
		return addTask(cron, task, true, true);
	}

	public Cron4jPlugin addTask(String cron, ProcessTask processTask, boolean daemon, boolean enable) {
		taskInfoList.add(new TaskInfo(cron, processTask, daemon, enable));
		return this;
	}

	public Cron4jPlugin addTask(String cron, ProcessTask processTask, boolean daemon) {
		return addTask(cron, processTask, daemon, true);
	}

	public Cron4jPlugin addTask(String cron, ProcessTask processTask) {
		return addTask(cron, processTask, true, true);
	}

	public Cron4jPlugin addTask(String cron, Task task, boolean daemon, boolean enable) {
		taskInfoList.add(new TaskInfo(cron, task, daemon, enable));
		return this;
	}

	public Cron4jPlugin addTask(String cron, Task task, boolean daemon) {
		return addTask(cron, task, daemon, true);
	}

	public Cron4jPlugin addTask(String cron, Task task) {
		return addTask(cron, task, true, true);
	}
	
	public boolean start() {
		for (TaskInfo taskInfo : taskInfoList) {
			taskInfo.schedule();
		}
		for (TaskInfo taskInfo : taskInfoList) {
			taskInfo.start();
		}
		return true;
	}
	
	public boolean stop() {
		for (TaskInfo taskInfo : taskInfoList) {
			taskInfo.stop();
		}
		return true;
	}
	
	private static class TaskInfo {
		Scheduler scheduler;

		String cron;
		Object task;
		boolean daemon;
		boolean enable;

		TaskInfo(String cron, Object task, boolean daemon, boolean enable) {
			if (StrKit.isBlank(cron)) {
				throw new IllegalArgumentException("cron 不能为空.");
			}
			if (task == null) {
				throw new IllegalArgumentException("task 不能为 null.");
			}

			this.cron = cron.trim();
			this.task = task;
			this.daemon = daemon;
			this.enable = enable;
		}

		void schedule() {
			if (enable) {
				scheduler = new Scheduler();
				if (task instanceof Runnable) {
					scheduler.schedule(cron, (Runnable) task);
				} else if (task instanceof Task) {
					scheduler.schedule(cron, (Task) task);
				} else {
					scheduler = null;
					throw new IllegalStateException("Task 必须是 Runnable、ITask、ProcessTask 或者 Task 类型");
				}
				scheduler.setDaemon(daemon);
			}
		}

		void start() {
			if (enable) {
				scheduler.start();
			}
		}

		void stop() {
			if (enable) {
				if (task instanceof ITask) {
					((ITask)task).stop();
				}
				scheduler.stop();
			}
		}
	}
}

    ITask 文件内容如下:

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

  使用方法:

1:添加依赖

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

2:在 YourJFinal 中添加插件

me.add(new Cron4jPlugin("cron4jConfig.txt"));

3:在 cron4jConfig.txt 中添加配置

# cron4j 任务调度配置
cron4j=myTask
myTask.cron=0 * * * *
myTask.class=xxx.com.XxxTask
myTask.enable=true

4:让 xxx.com.XxxTask 实现 Runnable 接口,或者ITask 接口也可以,cron 表达式可以精确指定调度规则,记住 cron4j 的cron 表达式只有五部分:分(0-59)、小时(0-23)、天(1-31)、月(1-12)、周(0-6)其中0表示周日,6表示周六

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文