有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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中配置一些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;
    }
}

现在,我有一个工作经理。类,该类管理作业详细信息和触发器

@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) 个答案

  1. # 1 楼答案

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

            sti.setJobKey(this.jobDetail.getKey());
    

    也就是说,jobDetail可以为空

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

    您可以使用4.3.2或更高版本

    在4.3.2版本中

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