web-dev-qa-db-fra.com

Comment passer des variables d'instance dans un travail Quartz?

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

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

47
Rips

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.

9
Vikdor

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
1
Harsh Maheswari

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.

0
Matthew