2012-10-08 11 views
18

Mi chiedo come passare una variabile di istanza esternamente in Quartz?Come passare le variabili di istanza nel processo Quartz?

Di seguito è riportato lo pseudo codice che vorrei scrivere. Come posso passare ExternalInstance in questo Job?

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

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

Iniettare l'externalInstance nel tuo lavoro – Anshu

risposta

39

si può mettere l'istanza nel schedulerContext.When che si sta per pianificare il processo, poco prima che si può fare qui di seguito:

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

La classe di posti di lavoro sarebbe come di seguito:

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(); 
    } 
} 

Se si utilizza Spring, è possibile utilizzare il supporto di Spring per iniettare l'intera applicationContext come risposta nel Link

+0

Funziona bene per oggetti serializzabili e funzionerà per le classi a cui hai accesso. Cosa succede se voglio iniettare qualcosa da un vaso esterno? Per esempio, sto cercando di scrivere un StatefulJob che elenca tutti i file in un bucket S3 da una certa data e memorizza i file elencati in JobDetailMap. Voglio iniettare una molla configurata AmazonS3Client nel mio lavoro. Non posso farlo perché quella classe non è serializzabile, e quindi devo iniettare la chiave segreta, la chiave di accesso e scrivere il codice per gestire la creazione di un client s3. È il modo migliore per farlo? Qualsiasi suggerimento sarebbe utile. –

+0

Rispondendo alla mia domanda - autowire il lavoro, ho trovato questa ottima soluzione online - http://stackoverflow.com/questions/4258313/how-to-use-autowired-in-a-quartz-job –

+1

Lavoro eccellente. Mi ha aiutato. –

5

Mentre la pianificazione del lavoro utilizzando un trigger, si sarebbe definito JobDataMap che viene aggiunto al JobDetail. Tale oggetto JobDetail sarà presente nello JobExecutionContext passato al metodo execute() nel tuo Job. Quindi, dovresti trovare un modo per passare la tua ExternalInstance attraverso lo JobDataMap. HTH.

+0

esempio esterno Voglio dire che potrebbe essere qualsiasi tipo di dati personalizzato, non limitato al tipo di dati nativo, come String, Float , Int ecc. Ho letto dalla documentazione, dice che l'istanza deve essere serializzabile. – janetsmith

+0

Nel nostro caso, gli oggetti su cui lavorare sono oggetti DB, quindi abbiamo usato i criteri per archiviarli dal DB, in JobDataMap e recuperarli nel metodo execute. Quindi, è anche necessario trovare un modo per passare le informazioni richieste per recuperare l'istanza esterna da qualche archivio se non è possibile renderli tutti serializzabili. – Vikdor

0

Questo è il responsib ility di JobFactory. L'implementazione predefinita PropertySettingJobFactory invocherà qualsiasi metodo di impostazione del bean, in base alle proprietà trovate nel contesto schdeuler, al trigger e ai dettagli del lavoro. Quindi, fintanto che avete implemnted un metodo setContext() setter adeguato si dovrebbe essere in grado di fare una delle seguenti:

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

O

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

O

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

Oppure, se questo isn Non basta che tu possa fornire la tua classe JobFactory che istanzia gli oggetti di lavoro come preferisci.

0

Risolvere questo problema creando un'interfaccia con uno HashMap inserendo le informazioni richieste.

Implementare questa interfaccia nella classe Quartz Job questa informazione sarà accessibile.

In IFace

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

In Job

map.get(context.getJobDetail().getKey()) => will give you Object 
Problemi correlati