Quartz 2.1.5:尝试使用JobBuilder动态创建作业详细信息

时间:2012-08-17 17:22:28

标签: java classloader quartz-scheduler

我已经看过几篇关于此的帖子,但是不能在Quartz中使用新的JobBuilder方法。

我正在尝试使用存储类名的字符串动态创建JobDetail。但是我收到以下编译器错误:

 The method newJob(Class<? extends Job>) in the type JobBuilder is not applicable 
 for the arguments (Class<capture#6-of ?>)

这是代码:

String s = "ClassName";
Class<?> jobClass = null;
try {
    jobClass = Class.forName (s);
} catch (ClassNotFoundException e) {
    e.printStackTrace();
    throw new MsgException ( "Requested Job Class not found" );
}

JobDetail jobDetail = newJob(jobClass).
        withIdentity(jobKey).
        withDescription(description).
        storeDurably().
        usingJobData(dataMap).
        build();

2 个答案:

答案 0 :(得分:0)

您是否看过错误消息? newJob采用Class<? extends Job>类型的参数,但您传递的是Class<?>类型的参数。作为快速修复,您可以尝试将其更改为

newJob((Class<? extends Job>)jobClass)

从长远来看,你可能想要进行实际检查以确保它是Job的子类,否则你会在Quartz内部遇到神秘的运行时错误。

答案 1 :(得分:0)

我认为newJob构造函数需要编译时引用,而Class.forName()等方法是运行时引用。中间解决方案是使用类似的东西:

private void makeNewJob(Class<? extends Job> jobClass, String identity,
    String environment)
{
    JobDetail job = newJob(jobClass).withIdentity(identity, environment)
        .build();

// additional code
}

并致电:

makeNewJob(MyJob.class, "MyJob", "Production");