//package cn.datax.service.quartz.config;
//
//import cn.datax.service.quartz.quartz.utils.ScheduleUtil;
//import com.zaxxer.hikari.HikariDataSource;
//import org.quartz.Scheduler;
//import org.quartz.spi.TriggerFiredBundle;
//import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
//import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
//import org.springframework.boot.autoconfigure.quartz.QuartzDataSource;
//import org.springframework.boot.context.properties.ConfigurationProperties;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.context.annotation.Primary;
//import org.springframework.scheduling.quartz.AdaptableJobFactory;
//import org.springframework.scheduling.quartz.SchedulerFactoryBean;
//import org.springframework.stereotype.Component;
//
//import javax.sql.DataSource;
//
//@Configuration
//public class QuartzConfig {
//
//    /**
//     * 创建 mysql 数据源的配置对象
//     */
//    @Primary
//    @Bean(name = "mysqlDataSourceProperties")
//    @ConfigurationProperties(prefix = "spring.datasource.mysql")
//    public DataSourceProperties mysqlDataSourceProperties() {
//        return new DataSourceProperties();
//    }
//
//    /**
//     * 创建 mysql 数据源
//     */
//    @Primary
//    @Bean(name = "mysqlDataSource")
//    @ConfigurationProperties(prefix = "spring.datasource.mysql")
//    public DataSource userDataSource() {
//        // 获得 DataSourceProperties 对象
//        DataSourceProperties properties =  this.mysqlDataSourceProperties();
//        // 创建 HikariDataSource 对象
//        return createHikariDataSource(properties);
//    }
//
//    /**
//     * 创建 quartz 数据源的配置对象
//     */
//    @Bean(name = "quartzDataSourceProperties")
//    @ConfigurationProperties(prefix = "spring.datasource.quartz")
//    public DataSourceProperties quartzDataSourceProperties() {
//        return new DataSourceProperties();
//    }
//
//    /**
//     * 创建 quartz 数据源
//     */
//    @Bean(name = "quartzDataSource")
//    @ConfigurationProperties(prefix = "spring.datasource.quartz")
//    @QuartzDataSource
//    public DataSource quartzDataSource() {
//        // 获得 DataSourceProperties 对象
//        DataSourceProperties properties =  this.quartzDataSourceProperties();
//        // 创建 HikariDataSource 对象
//        return createHikariDataSource(properties);
//    }
//
//    private static HikariDataSource createHikariDataSource(DataSourceProperties properties) {
//        // 创建 HikariDataSource 对象
//        HikariDataSource dataSource = properties.initializeDataSourceBuilder().type(HikariDataSource.class).build();
//        return dataSource;
//    }
//
//    /**
//     * 该类主要是为了把 job 对象的注入到 spring 中
//     */
//    @Component("quartzJobFactory")
//    public static class QuartzJobFactory extends AdaptableJobFactory {
//        //这个对象可以通过 ApplicationContext.getAutowireCapableBeanFactory()获取
//        private final AutowireCapableBeanFactory capableBeanFactory;
//
//        public QuartzJobFactory(AutowireCapableBeanFactory capableBeanFactory) {
//            this.capableBeanFactory = capableBeanFactory;
//        }
//        /**
//         * Job 对象的实例化过程是在Quartz中进行的，通过重写此方法 把job 实例注入到spring容器中
//         */
//        @Override
//        protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
//            //调用父类的方法
//            Object jobInstance = super.createJobInstance(bundle);
//            //注入到spring容器
//            capableBeanFactory.autowireBean(jobInstance);
//            return jobInstance;
//        }
//    }
//
//    /**
//     * 注入scheduler到spring
//     * @param quartzJobFactory
//     * @return Scheduler
//     * @throws Exception
//     */
//    @Bean(name = "scheduler")
//    public Scheduler scheduler(QuartzJobFactory quartzJobFactory) throws Exception {
//        SchedulerFactoryBean factoryBean = new SchedulerFactoryBean();
//        factoryBean.setJobFactory(quartzJobFactory);
//        factoryBean.setDataSource(quartzDataSource());
//        factoryBean.afterPropertiesSet();
//        Scheduler scheduler = factoryBean.getScheduler();
//        scheduler.start();
//        // 设置ScheduleUtil的定时处理对象
//        ScheduleUtil.setScheduler(scheduler);
//        return scheduler;
//    }
//}
