使用存储在数据库中的Java类名运行Quartz作业

时间:2010-07-06 09:58:40

标签: java class quartz-scheduler casting

我在Quartz有两个工作,但是我发现我必须使用如下代码:

jd = new JobDetail(sj.getJobName(), scheduler.DEFAULT_GROUP, PollJob.class);
ct = new CronTrigger(sj.getJobTrigger(), scheduler.DEFAULT_GROUP, "0 20 * * * ?");
        scheduler.scheduleJob(jd, ct);

我必须硬编码PollJob.class来运行作业,而sj是从包含PollJob详细信息的数据库中读取的对象。但是我想从数据库中设置PollJob.class。我试过通过以下方式去上课:

Class cls = Class.forName(sj.getJobJavaClassFile());
jd = new JobDetail(sj.getJobName(), scheduler.DEFAULT_GROUP, cls));

直接使用类引用:

    jd = new JobDetail(sj.getJobName(), scheduler.DEFAULT_GROUP, Class.forName sj.getJobJavaClassFile()));

但这项工作根本没有执行。我没有看到生成的异常,也没有堆栈跟踪?

我在Windows 7上运行JVM。

有什么想法吗?

摩根先生。

1 个答案:

答案 0 :(得分:0)

我猜你已经将这个类作为String存储在数据库中,并且你试图把它变成一个类?我遇到了同样的问题。

我需要创建的作业的详细信息在BatchJobDto对象中提供。它包含诸如作业名称,类名称等字符串之类的内容。特别是batchJobDto.getClassName()返回一个String,它是我的作业类的完全限定名称(“com.foo.bar.MyJob”或其他)。我创建了触发器,从String中获取类并创建作业。从String中获取类的顺序是:

Class<? extends Job> jobClass = null;
try {
    jobClass = (Class<? extends Job>)
                  Class.forName(batchJobDto.getClassName());
} catch(ClassNotFoundException e) {
    logger.error("createJob(): ClassNotFoundException on job class {} - {}",
        batchJobDto.getClassName(), e.getMessage());
} catch(Exception e) {
    logger.error("createJob(): Exception on job class {} - {}",
        batchJobDto.getClassName(), e.getMessage());
}

使用slf4j完成日志记录,允许您使用参数化消息(“{}”,如上所述)。

那里有一个未经检查的强制转换,但是如果你的classname字符串描述的是一个Quartz作业的类(实现Job),那么我相信它应该始终有效。