如何将实例变量传递给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传递给Jobexecute()方法。 因此,您应该找到一种通过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