Java 弹簧&x2B;石英,触发器为空

Java 弹簧&x2B;石英,触发器为空,java,spring,Java,Spring,我和石英住在一起 我需要创建,应用程序启动,一些触发器和工作细节 这是我的工作 @DisallowConcurrentExecution public class TimeoutJob extends QuartzJobBean{ public final String ID = "idInterruttore"; private final Logger logger = Logger.getLogger(TimeoutJob.class); @Autowired

我和石英住在一起

我需要创建,应用程序启动,一些触发器和工作细节

这是我的工作

@DisallowConcurrentExecution
public class TimeoutJob extends QuartzJobBean{

    public final String ID = "idInterruttore";

    private final Logger logger = Logger.getLogger(TimeoutJob.class);

    @Autowired InterruttoreService interruttoreService;

    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {

        JobDataMap dataMap = context.getJobDetail().getJobDataMap();
        int idInterruttore = dataMap.getIntFromString(ID);
        Interruttore interruttore = interruttoreService.findById(idInterruttore);
        logger.debug("Job reached for " + interruttore.getNomeInterruttore());

    }
}
然后在QuartzConfiguration.java中配置一些bean

@Configuration
@ComponentScan("it.besmart")
public class QuartzConfiguration {

    @Autowired
    ApplicationContext applicationContext;

    @Bean
    public SchedulerFactoryBean scheduler() {
        SchedulerFactoryBean schedulerFactory = new SchedulerFactoryBean();
        schedulerFactory.setJobFactory(springBeanJobFactory());
        return schedulerFactory;
    }

    @Bean
    public SpringBeanJobFactory springBeanJobFactory() {
        AutoWiringSpringBeanJobFactory jobFactory = new AutoWiringSpringBeanJobFactory();
        jobFactory.setApplicationContext(applicationContext);

        return jobFactory;
    }
}
现在,我有一个JobManager.class,它管理作业详细信息和触发器

@Service("jobManager")
public class JobManager {

    private final Logger logger = Logger.getLogger(JobManager.class);

    @Autowired
    SchedulerFactoryBean scheduler;

    @Autowired
    InterruttoreService interruttoreService;

    @PostConstruct
    public void createInitialJobs() {
        logger.debug("Start ut jobs to create");
        List<Interruttore> interruttori = interruttoreService.findAllSwitches();
        Date now = new Date();
        for (int i = 0; i < interruttori.size(); i++) {
            Interruttore interruttore = interruttori.get(i);
            if (interruttore.getTimeoutDate().after(now) && interruttore.isStato()) { 
                // JobDetail and Trigger creation
                createJob(interruttore, interruttore.getTimeoutDate());
            }
        }

    }

    public void createJob(Interruttore interruttore, Date richiesta) {

        JobDetailFactoryBean jobDetail = new JobDetailFactoryBean();
        jobDetail.setJobClass(TimeoutJob.class);
        jobDetail.setName("Job detail for " + interruttore.getNomeInterruttore());
        jobDetail.setDescription("Job Description");
        jobDetail.setDurability(true);

        Map<String, Integer> map = new HashMap<String,Integer>();
        map.put("idInterruttore", interruttore.getIdInterruttore());
        jobDetail.setJobDataAsMap(map);

        long future = richiesta.getTime() - new Date().getTime();
        logger.debug("next timeout is " + future / 1000 / 60 + " minuti for " + interruttore.getNomeInterruttore());

        //trigger creation
        SimpleTriggerFactoryBean trigger = new SimpleTriggerFactoryBean();
        trigger.setName("myTrigger"+interruttore.getNomeInterruttore());
        trigger.setGroup("timeoutTriggers");
        trigger.setJobDetail(jobDetail.getObject());
        trigger.setStartDelay(0);
        trigger.setRepeatCount(1);
        trigger.setRepeatInterval(future);
        trigger.afterPropertiesSet();
        logger.debug("Trigger for " + interruttore.getNomeInterruttore());
        logger.debug("Trigger object is :" + trigger.getObject());
        logger.debug("Next Trigger date " + trigger.getObject().getFinalFireTime());

        try {
            scheduler.getScheduler().scheduleJob(jobDetail.getObject(), trigger.getObject());
        } catch (SchedulerException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
引起

Caused by: java.lang.NullPointerException
    at org.springframework.scheduling.quartz.SimpleTriggerFactoryBean.afterPropertiesSet(SimpleTriggerFactoryBean.java:231)
    at it.besmart.quartz.JobManager.createJob(JobManager.java:85)
    at it.besmart.quartz.JobManager.createInitialJobs(JobManager.java:54)
那是

trigger.afterPropertiesSet();

由于没有创建我的触发器…

spring上下文支持JAR4.2.5版本中有一个bug

        sti.setJobKey(this.jobDetail.getKey());
i、 e.作业详细信息可以为空

在新版本中,它是固定的。我检查了4.3.2版本

您可以使用4.3.2或更高版本

在4.3.2版本中

if (this.jobDetail != null) {
        sti.setJobKey(this.jobDetail.getKey());
    }

您的spring上下文支持jar版本是什么?我正在使用spring Boot 1.3.3和spring上下文支持4.2.5这个版本4.2.5.RELEASE?是的,4.2.5.RELEASE是的,我升级了我所有的jar,但我得到了
org.quartz.SchedulerException:JobDetail不能在org.quartz.core.QuartzScheduler.scheduler.scheduleJob(QuartzScheduler.java:849)为空在org.quartz.impl.StdScheduler.scheduleJob(StdScheduler.java:249)在it.besmart.quartz.JobManager.createJob(JobManager.java:91)在it.besmart.quartz.JobManager.createInitialJobs(JobManager.java:54)
这是
调度程序.getScheduleJob().scheduleJob(jobDetail.getObject(),trigger.getObject())我正在使用4.3.3.RELEASE作为版本您没有调用jobDetail.AfterPropertieSet()就像您为triggercool所做的那样:)。。不客气。。你对quartz还有其他问题吗?现在我必须在超时改变时动态管理触发器的更新,如果我有问题,我会知道该问谁!
if (this.jobDetail != null) {
        sti.setJobKey(this.jobDetail.getKey());
    }