java - valor - ¿Cómo pasar las variables de instancia al trabajo de cuarzo?
que es una clase en java (4)
Me pregunto cómo pasar una variable de instancia externamente en Cuarzo?
A continuación se muestra el pseudo código que me gustaría escribir. ¿Cómo puedo pasar ExternalInstance a este trabajo?
public class SimpleJob implements Job {
@Override
public void execute(JobExecutionContext context)
throws JobExecutionException {
float avg = externalInstance.calculateAvg();
}
}
Al programar el trabajo utilizando un desencadenador, habría definido JobDataMap
que se agregará a JobDetail
. Ese objeto JobDetail estará presente en el JobExecutionContext
pasado al método execute()
en su Job
. Por lo tanto, debe encontrar una manera de pasar su JobDataMap
externa a través del JobDataMap
. HTH.
Esta es la responsabilidad de JobFactory
. La implementación predeterminada de PropertySettingJobFactory
invocará cualquier método de establecimiento de bean, en función de las propiedades que se encuentren en el contexto de Schdeuler, el desencadenante y los detalles del trabajo. Entonces, siempre que haya implementado un método de establecimiento de setContext()
apropiado, debería poder hacer cualquiera de las siguientes setContext()
:
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()
O si eso no es suficiente, puede proporcionar su propia clase JobFactory
, que JobFactory
una instancia de los objetos de trabajo como le plazca.
Resuelva este problema creando una interfaz con un HashMap
pone la información requerida allí.
Implemente esta interfaz en su clase de Job
cuarzo, esta información será accesible.
En IFace
Map<JobKey,Object> map = new HashMap<>();
En el Job
map.get(context.getJobDetail().getKey()) => will give you Object
puede poner su instancia en el schedulerContext. Cuando vaya a programar el trabajo, justo antes puede hacerlo a continuación:
getScheduler().getContext().put("externalInstance", externalInstance);
Su clase de trabajo sería como a continuación:
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 está utilizando Spring, realmente puede usar el soporte de Spring para inyectar todo el contexto de la aplicación como se responde en el Link