2012-08-17 28 views
0

我已經看到了幾篇關於這方面的文章,但是並沒有在Quartz中使用新的JobBuilder方法。石英2.1.5:嘗試使用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(); 

回答

0

你看看錯誤訊息? newJob需要Class<? extends Job>類型的參數,但是您將類型爲Class<?>的參數傳遞給它。作爲速戰速決,你可以嘗試將其更改爲

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

在你可能會想要做實際的檢查,以確保它是工作的一個子類,從長遠來看,否則你會得到神祕的運行時錯誤從Quartz裏面,當它不是。

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");