springboot 结合 Quartz 开发中的一些坑

      最近一直被各种问题打断,没有静下心来去对现有问题进行深思。老样子,还是拿一个具体的问题开刀。

      

    【问题描述】

      通过springboot 创建定时任务, 创建完定时任务后,需要对定时任务进行删除,但是任务始终删除不了

      删除代码如下:

 @Override
    public void deleteTrigger(String triggerName, String jobName, String group) {
        try {
            logger.debug("delete trigger {" + triggerName + "@" + group + "}");
            //pause trigger
            scheduler.pauseTrigger(TriggerKey.triggerKey(triggerName, group));
            //delete job
            scheduler.deleteJob(JobKey.jobKey(jobName, group));
            scheduler.unscheduleJob(TriggerKey.triggerKey(triggerName, group));
            logger.debug("trigger {" + triggerName + "@" + group + "} resumed");
        } catch (SchedulerException e) {
            logger.warn("delete trigger error", e);
            throw new RuntimeException(e);
        }
    } 

       开始的时候,总是在想为什么删不了,查看源码,实现如下:

       StdJDBCDelegate 代理类实现:

 /**
     * <p>
     * Delete the base trigger data for a trigger.
     * </p>
     * 
     * @param conn
     *          the DB Connection
     * @return the number of rows deleted
     */
    public int deleteTrigger(Connection conn, TriggerKey triggerKey) throws SQLException {
        PreparedStatement ps = null;

        deleteTriggerExtension(conn, triggerKey);
        
        try {
            ps = conn.prepareStatement(rtp(DELETE_TRIGGER));
            ps.setString(1, triggerKey.getName());
            ps.setString(2, triggerKey.getGroup());

            return ps.executeUpdate();
        } finally {
            closeStatement(ps);
        }
    }
    

 实现Sql:

  String DELETE_TRIGGER = "DELETE FROM "
            + TABLE_PREFIX_SUBST + TABLE_TRIGGERS + " WHERE "
            + COL_SCHEDULER_NAME + " = " + SCHED_NAME_SUBST
            + " AND " + COL_TRIGGER_NAME + " = ? AND " + COL_TRIGGER_GROUP + " = ?";

  但是打断点,却没有执行皱眉 

  然后查看当时SchedulerFactoryBean  这个对象的值 是自己new的,并没有从容器中获取皱眉,导致创建的scheduler对象是null,后来改成bean 注入方式

    @Bean(name = "schedulerFactoryBean")
    public SchedulerFactoryBean schedulerFactory(DruidDataSource dataSource) {
        SchedulerFactoryBean factory = new SchedulerFactoryBean();
        //TODO 程序启动后,延迟20s执行
        factory.setStartupDelay(20);
        factory.setDataSource(dataSource);
        factory.setQuartzProperties(quartzConfigurationProperties);
        factory.setTriggers(cronTriggerFactoryBean().getObject());

        return factory;
    }


    @Bean(name = "scheduler")
    @ConditionalOnBean(SchedulerFactoryBean.class)
    public Scheduler schedulerBean(SchedulerFactoryBean schedulerFactoryBean) {
        schedulerFactoryBean.setTriggers(cronTriggerFactoryBean().getObject());
        Scheduler scheduler = schedulerFactoryBean.getScheduler();
        return scheduler;
    }

     当时写的时候,intellj 这块一直提示 “could not autowire” ,后来尝试启动,正常,想起来,intellj 太过智能,导致一些误报,关掉



        

关掉 一切正常

   【结束语】

   至此,该问题就解决了,使用springboot 还需要深入

猜你喜欢

转载自zhuanjiao520.iteye.com/blog/2335843