java - Spring + Quartz,触发器为空

标签 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 和触发器

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

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

最佳答案

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

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

即jobDetail 可以为 null。

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

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

4.3.2版本中

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

关于java - Spring + Quartz,触发器为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40594447/

相关文章:

java - Android 检索手机内存中的最新图像?

java - Richfaces 中带注释的 ManagedBean?

jquery - Spring MVC JQuery 的问题

java - Spring:不支持请求方法 'PUT'

java - Hibernate OneToOne 映射反向?

java - Java中的指针

java - Android Viewpager 为空

java - spring-boot 应用程序启动失败

WLP (WebSphere Liberty) 上的 Spring Boot 部署抛出 CWWKC0044W 错误

java - 在 Spring 应用程序中从 JBOSS 4.2.3 配置 JNDI 数据源