0

我已经看过几篇关于这个的帖子,但是不要使用 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();
4

2 回答 2

1

我认为 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");
于 2014-05-11T12:53:44.667 回答
0

你看错误信息了吗?newJob接受一个 type 的参数Class<? extends Job>,但你传递给它一个 type 的参数Class<?>。作为快速修复,您可以尝试将其更改为

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

从长远来看,您可能需要进行实际检查以确保它是 Job 的子类,否则您会从 Quartz 内部得到神秘的运行时错误,而实际上它不是。

于 2012-08-17T17:29:40.607 回答