2012-10-08 50 views
18

我想知道如何在Quartz中外部傳遞一個實例變量?如何將實例變量傳遞到Quartz作業?

下面是我想寫的僞代碼。我如何將externalInstance傳遞給這個Job?

public class SimpleJob implements Job { 
     @Override 
     public void execute(JobExecutionContext context) 
       throws JobExecutionException { 

      float avg = externalInstance.calculateAvg(); 
     } 
} 
+0

注入externalInstance在你的工作 – Anshu

回答

39

您可以把您的實例在schedulerContext.When你要安排工作,只是你可以在下面做之前:

getScheduler().getContext().put("externalInstance", externalInstance); 

你的任務類將是象下面這樣:

public class SimpleJob implements Job { 
    @Override 
    public void execute(JobExecutionContext context) 
      throws JobExecutionException { 
     SchedulerContext schedulerContext = null; 
     try { 
      schedulerContext = context.getScheduler().getContext(); 
     } catch (SchedulerException e1) { 
      e1.printStackTrace(); 
     } 
     ExternalInstance externalInstance = 
      (ExternalInstance) schedulerContext.get("ExternalInstance"); 

     float avg = externalInstance.calculateAvg(); 
    } 
} 

如果你正在使用Spring,你可以實際使用Spring的支持,注入整個的applicationContext喜歡回答的Link

+0

這對於可序列化的對象工作正常,並且它將適用於您有權訪問的類。如果我想從外部瓶子注入東西會怎麼樣? 例如,我試圖編寫一個StatefulJob,它列出自某個日期以來S3存儲桶中的所有文件,並存儲它在JobDetailMap中列出的文件。我想將一臺配置AmazonS3Client的彈簧注入到我的工作中。我不能這樣做,因爲該類不是可序列化的,所以我必須注入密鑰,訪問密鑰和編寫代碼來管理s3客戶端的創建。這是做這件事的最好方法嗎?任何的意見都將會有幫助。 –

+0

回答我自己的問題 - autowire這項工作,發現這真的很好的解決方案在線 - http://stackoverflow.com/questions/4258313/how-to-use-autowired-in-a-quartz-job –

+1

優秀的工作。幫助過我。 –

5

在使用觸發調度工作,你就已經定義了被添加到JobDetailJobDataMap。該JobDetail對象將出現在您的Job中傳遞給​​方法的JobExecutionContext中。所以,你應該想辦法通過JobDataMap來傳遞你的externalInstance。 HTH。

+0

外部比如我的意思可以是任何自定義數據類型,不限於本地數據類型,如String,浮動,Int等我從文檔中讀取,它說實例需要可序列化。 – janetsmith

+0

在我們的例子中,要處理的對象是數據庫對象,因此我們使用條件從數據庫中檢索它們,存儲在JobDataMap中,並在execute方法中檢索它們。所以,你還需要找出一種方法來傳遞從某個商店中檢索外部實例所需的信息,如果你不能使它們都是可序列化的。 – Vikdor

0

這是responsib JobFactory。默認的PropertySettingJobFactory實現將根據schdeuler上下文中找到的屬性,觸發器和作業細節調用任何bean設置器方法。所以只要你有implemnted適當setContext() setter方法,你應該能夠做到以下任何一項:

scheduler.getContext().put("context", context); 

或者

Trigger trigger = TriggerBuilder.newTrigger() 
    ... 
    .usingJobData("context", context) 
    .build() 

或者

JobDetail job = JobBuilder.newJob(SimpleJob.class) 
    ... 
    .usingJobData("context", context) 
    .build() 

或者如果ISN如果你願意的話,你可以提供你自己的JobFactory類來實例化Job對象。

0

通過創建一個接口與一個接口來解決此問題HashMap將所需信息放在那裏。

在你的Quartz Job類中實現這個接口,這個信息將被訪問。

IFace

Map<JobKey,Object> map = new HashMap<>(); 

Job

map.get(context.getJobDetail().getKey()) => will give you Object 
相關問題