如何将实例变量传递给Quartz作业?

时间:2012-10-08 07:23:03

标签: java quartz-scheduler

我想知道如何在Quartz中外部传递一个实例变量?

下面是我想写的伪代码。如何将externalInstance传递给此作业?

public class SimpleJob implements Job {
        @Override
        public void execute(JobExecutionContext context)
                throws JobExecutionException {

            float avg = externalInstance.calculateAvg();
        }
}

6 个答案:

答案 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;} }

就这样,干净,高效