Spring + Quartz,Trigger为null

时间:2016-11-14 17:25:03

标签: java spring

我和Quartz住在一起......

我需要创建,应用程序启动,一些触发器和作业详细信息..

所以,这是我的工作

@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来管理jobDetails和Triggers

@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();
        }
    }

启动应用时,@PostConstruct方法尝试创建触发器,但在创建jobManager时出现异常

Application startup failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jobManager': Invocation of init method failed; nested exception is java.lang.NullPointerException

引起的

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();

因为我的触发器没有创建......

1 个答案:

答案 0 :(得分:2)

spring-context-support jar 4.2.5版本中存在一个错误。

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

即。 jobDetail可以为null。

在新版本中,它已修复。我检查了4.3.2版本。

您可以使用4.3.2或更高版本。

在4.3.2版本中

import logging
logger=logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
logger.addHandler(logging.StreamHandler())  # <<< Add a handler
logger.debug("Test")