我有一个用Java编写的Quartz作业,如果我按如下方式设置Quartz JobDetail行,它运行正常:
JobDetail jd = new JobDetail("FeedMinersJob", scheduler.DEFAULT_GROUP, FeedMinersScheduler.class);
但是我想动态加载类,因为作业详细信息存储在数据库表中。所以我想要这样的东西:
JobDetail jd = new JobDetail(sj.getJobName(), scheduler.DEFAULT_GROUP, sj.getJobClassFile());
其中sj是预定作业对象和方法sj.getJobClassFile()返回sj中定义的类的名称,而不是使用硬编码的类名。
我尝试过Java Class.forName方法的排列,但没有成功。
答案 0 :(得分:1)
我遇到了同样的问题。 它不输出任何内容,也不会抛出错误。 这是因为您的工作类没有空构造函数。因此,即使代码是正确的,它也没有创建作业对象的机制。 如果向Job类中添加一个空构造函数,它将起作用。
答案 1 :(得分:0)
据我了解,您的代码应该是这样的:
Class<?> jobClass = Class.forName(sj.getJobClassFile());
JobDetail jd = new JobDetail(sj.getJobName(), scheduler.DEFAULT_GROUP, jobClass);
您能否发布不起作用的代码片段?
答案 2 :(得分:0)
试试这个
try {
Class<?> jobClass = Class.forName(sj.getJobClassFile());
JobDetail jd = new JobDetail(sj.getJobName(), scheduler.DEFAULT_GROUP, jobClass);
} catch (ClassNotFoundException e) {
// put here some error handling
}
如果它不起作用请提供有关该问题的更多详细信息 - 编译错误,运行时异常或其他一些问题。
答案 3 :(得分:0)
我有这个,也许它对你有用:(获取Class Name()返回一个字符串)
Class<?> jobClass = Class.forName(t_job.getClassName());
if (Job.class.isAssignableFrom(jobClass)) {
// create a job detail that is not volatile and is durable (is persistent and exists without trigger)
JobDetail job = new JobDetail(t_job.getName(), t_job.getGroupName(), jobClass, false, true, true);
job.setDescription(t_job.getDescription());
}