石英如何改变JobExecutionContext&的范围?调度程序到班级?

时间:2014-06-11 08:34:43

标签: java spring quartz-scheduler scheduling job-scheduling

在执行内部方法中我得到了Object但是在执行完成后,类级变量又变为NULL?为什么呢?

public class CampaignJob extends QuartzJobBean {

Scheduler scheduler ;
JobExecutionContext jobExecutionContext ;


@Override
protected void executeInternal(JobExecutionContext jobCtx)
        throws JobExecutionException {
    // TODO Auto-generated method stub
    System.out.println("ExecuteInternal method is called.....");
    SchedulerContext schedCtx = null;
    // jobCtx.getTrigger().getFinalFireTime().setSeconds(0);

    jobCtx.getTrigger().setStartTime(new Date());

    try {
        schedCtx = jobCtx.getScheduler().getContext();
        ApplicationContext appCtx = (ApplicationContext) schedCtx.get("applicationContext");

        //here i am getting scheduler obj i want ot use in other method
        scheduler = jobCtx.getScheduler();
        jobExecutionContext = jobCtx;
    } catch (SchedulerException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

1 个答案:

答案 0 :(得分:1)

单个作业执行之间不保留实例变量只是因为Quartz为每个作业执行创建了一个新的JobDetail(CampaignJob)实例。

请注意,JobExecutionContext实例始终特定于特定作业执行(例如,它指的是执行作业的触发器),因此在单个作业执行之间保留它是没有任何意义的。

如果要在各个作业执行之间保留任何数据,您可能需要查看Quartz StatefulJob接口,该接口使得对JobDataMap进行Quartz持久更改(可通过JobExecutionContext访问)。考虑到Quartz使用标准的Java Serialization API来序列化和反序列化JobDataJMap内容,有一些关于你应该/不应该放入JobDataMap的规则。