我在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。
有什么想法吗?
摩根先生。答案 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),那么我相信它应该始终有效。