在Quartz作业中动态加载Java类文件的名称

时间:2009-09-17 08:12:07

标签: java quartz-scheduler classloader

我有一个用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方法的排列,但没有成功。

4 个答案:

答案 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());

}