我想知道如何在Quartz中外部传递一个实例变量?
下面是我想写的伪代码。如何将externalInstance传递给此作业?
public class SimpleJob implements Job {
@Override
public void execute(JobExecutionContext context)
throws JobExecutionException {
float avg = externalInstance.calculateAvg();
}
}
答案 0 :(得分:50)
你可以把你的实例放在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
中所回答的那样答案 1 :(得分:9)
在使用触发器安排作业时,您将定义JobDataMap
添加到JobDetail
。 JobDetail对象将出现在JobExecutionContext
中传递给execute()
方法的Job
中。所以,你应该想办法通过JobDataMap
传递你的externalInstance。 HTH。
答案 2 :(得分:1)
通过创建一个接口,解决此问题,其中一个HashMap
将所需信息放在那里。
在Quartz Job
类中实现此接口,可以访问此信息。
在IFace
Map<JobKey,Object> map = new HashMap<>();
在Job
map.get(context.getJobDetail().getKey()) => will give you Object
答案 3 :(得分:0)
这是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对象。
答案 4 :(得分:0)
将对象添加到JobDataMap:
JobDetail job = JobBuilder.newJob(MyJobClass.class)
.withIdentity("MyIdentity",
"MyGroup")
.build();
job.getJobDataMap()
.put("MyObject",
myObject);
从JobDataMap访问数据:
var myObject = (MyObjectClass) context.getJobDetail()
.getJobDataMap()
.get("carrier");
答案 5 :(得分:0)
Quartz有一种简单的方法,可以使用设置器从JobDataMap中获取grep参数
我正在使用Quartz 2.3,我只是使用setter来获取传递的实例对象
例如,我创建了此类
$resultset = runQuery("SELECT * FROM mytable WHERE id='5'")
echo $resultset['name'];
然后我创建了此类的一个实例并将其放入JobDataMap
public class Data implements Serializable {
@JsonProperty("text")
private String text;
@JsonCreator
public Data(@JsonProperty("b") String text) {this.text = text;}
public String getText() {return text;}
}
我的工作岗位看起来像这样
JobDataMap jobDataMap = new JobDataMap();
jobDataMap.put("data", new Data(1, "One!"));
JobDetail job = newJob(HelloJob.class)
.withIdentity("myJob", "group")
.withDescription("bla bla bla")
.usingJobData(jobDataMap) // <!!!
.build();
计划作业时,此代码将打印public class HelloJob implements Job {
Data data;
public HelloJob() {}
public void execute(JobExecutionContext context)
throws JobExecutionException
{
String text = data.getText();
System.out.println(text);
}
public void setData(Data data) {this.data = data;}
}
。
就这样,干净,高效