Je me demande comment passer une variable d'instance à l'extérieur dans Quartz?
Ci-dessous, le pseudo-code que je voudrais écrire. Comment puis-je passer externalInstance dans ce travail?
public class SimpleJob implements Job {
@Override
public void execute(JobExecutionContext context)
throws JobExecutionException {
float avg = externalInstance.calculateAvg();
}
}
vous pouvez mettre votre instance dans le planificateur de tâches. Lorsque vous planifiez le travail, vous pouvez le faire avant:
getScheduler().getContext().put("externalInstance", externalInstance);
Votre classe d'emploi serait comme ci-dessous:
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();
}
}
Si vous utilisez Spring, vous pouvez réellement utiliser le support Spring pour injecter l’application entièreContext comme indiqué dans le lien - Link
Lors de la planification du travail à l'aide d'un déclencheur, vous auriez défini JobDataMap
qui est ajouté à JobDetail
. Cet objet JobDetail sera présent dans la JobExecutionContext
transmise à la méthode execute()
dans votre Job
. Donc, vous devriez trouver un moyen de faire passer votre instance externe à travers la JobDataMap
. HTH.
Résolvez ce problème en créant une interface avec une HashMap
mettant les informations requises à cet endroit.
Implémentez cette interface dans votre classe Quartz Job
pour que ces informations soient accessibles.
Dans IFace
Map<JobKey,Object> map = new HashMap<>();
Dans Job
map.get(context.getJobDetail().getKey()) => will give you Object
C’est la responsabilité de la JobFactory
. L'implémentation par défaut PropertySettingJobFactory
appellera toutes les méthodes de définition de bean, en fonction des propriétés trouvées dans le contexte schdeuler, le déclencheur et les détails du travail. Donc, tant que vous avez implémenté une méthode de définition setContext()
appropriée, vous devriez pouvoir effectuer l’une des opérations suivantes:
scheduler.getContext().put("context", context);
Ou
Trigger trigger = TriggerBuilder.newTrigger()
...
.usingJobData("context", context)
.build()
Ou
JobDetail job = JobBuilder.newJob(SimpleJob.class)
...
.usingJobData("context", context)
.build()
Ou si cela ne suffit pas, vous pouvez fournir votre propre classe JobFactory
qui instancie les objets Job comme bon vous semble.