如何将实例变量传递给Quartz作业?
我想知道如何在Quartz中外部传递一个实例变量?
下面是我想写的伪代码。 我怎样才能将externalInstance传递给这个Job?
public class SimpleJob implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { float avg = externalInstance.calculateAvg(); } }
你可以把你的实例放在schedulerContext中。当你要安排工作时,就在你可以做到以下之前:
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中回答一样
在使用触发器调度作业时,您将定义添加到JobDetail
JobDataMap
。 JobDetail对象将出现在JobExecutionContext
中,该JobExecutionContext
传递给Job
的execute()
方法。 因此,您应该找到一种通过JobDataMap
传递externalInstance的方法。 HTH。
这是JobFactory
的责任。 默认的PropertySettingJobFactory
实现将根据schdeuler上下文中的属性,触发器和作业详细信息调用任何bean-setter方法。 因此,只要您实现了适当的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()
或者,如果这还不够,您可以提供自己的JobFactory
类,然后根据需要实例化Job对象。
通过创建一个带有一个HashMap
接口来解决这个问题,在那里放置所需的信息。
在Quartz Job
类中实现此接口,可以访问此信息。
在IFace
Map map = new HashMap<>();
在Job
map.get(context.getJobDetail().getKey()) => will give you Object