All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.taotao.boot.job.quartz.configuration.QuartzJobAutoConfiguration Maven / Gradle / Ivy

/*
 * Copyright (c) 2020-2030, Shuigedeng ([email protected] & https://blog.taotaocloud.top/).
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.taotao.boot.job.quartz.configuration;

import com.taotao.boot.cache.redis.repository.RedisRepository;
import com.taotao.boot.common.constant.StarterName;
import com.taotao.boot.common.utils.context.ContextUtils;
import com.taotao.boot.common.utils.log.LogUtils;
import com.taotao.boot.job.quartz.event.DefaultQuartzEventListener;
import com.taotao.boot.job.quartz.event.RedisQuartzEventListener;
import com.taotao.boot.job.quartz.listener.QuartzListenerRegister;
import com.taotao.boot.job.quartz.properties.QuartzProperties;
import com.taotao.boot.job.quartz.utils.QuartzManager;
import org.quartz.Scheduler;
import org.quartz.spi.TriggerFiredBundle;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import org.springframework.scheduling.quartz.SpringBeanJobFactory;
import org.springframework.stereotype.Component;

/**
 * 定时任务配置
 *
 * @author shuigedeng
 * @version 2022.03
 * @since 2022-03-25 15:01:01
 */
@AutoConfiguration
@ConditionalOnProperty(prefix = QuartzProperties.PREFIX, name = "enabled", havingValue = "true", matchIfMissing = true)
@EnableConfigurationProperties(value = {QuartzProperties.class})
public class QuartzJobAutoConfiguration implements ApplicationContextAware, InitializingBean {

    @Override
    public void afterPropertiesSet() throws Exception {
        LogUtils.started(QuartzJobAutoConfiguration.class, StarterName.JOB_QUARTZ_STARTER);
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        ContextUtils.setApplicationContext((ConfigurableApplicationContext) applicationContext);
    }

    /** 解决Job中注入Spring Bean为null的问题 */
    @Component("quartzJobFactory")
    public static class QuartzJobFactory extends SpringBeanJobFactory {

        private final AutowireCapableBeanFactory capableBeanFactory;

        public QuartzJobFactory(AutowireCapableBeanFactory capableBeanFactory) {
            this.capableBeanFactory = capableBeanFactory;
        }

        @Override
        protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
            // 调用父类的方法
            Object jobInstance = super.createJobInstance(bundle);
            capableBeanFactory.autowireBean(jobInstance);
            return jobInstance;
        }
    }

    /** 注入scheduler到spring */
    @Bean(name = "scheduler")
    public Scheduler scheduler(SchedulerFactoryBean schedulerFactoryBean) throws Exception {
        Scheduler scheduler = schedulerFactoryBean.getScheduler();
        // scheduler.getListenerManager().addJobListener(new QuartzJobListener());

        // 添加JobListener, 精确匹配JobKey
        // KeyMatcher keyMatcher = KeyMatcher.keyEquals(JobKey.jobKey("helloJob",
        // "group1"));
        // scheduler.getListenerManager().addJobListener(new HelloJobListener(), keyMatcher);

        scheduler.start();
        return scheduler;
    }

    @Bean
    public QuartzManager quartzManage() {
        return new QuartzManager();
    }

    @Bean
    public QuartzListenerRegister quartzListenerRegister() {
        return new QuartzListenerRegister();
    }

    @Bean
    @ConditionalOnBean(RedisRepository.class)
    public RedisQuartzEventListener redisQuartzLogEventListener(RedisRepository repository) {
        return new RedisQuartzEventListener( repository);
    }

    @Bean
    @ConditionalOnMissingBean
    public DefaultQuartzEventListener defaultQuartzLogEventListener() {
        return new DefaultQuartzEventListener();
    }

    /// **
    // * 主要解决 @ConditionalOnSingleCandidate(DataSource.class)
    // * 

// * 此处从 QuartzAutoConfiguration copy 如elastic改进之后可以删除此段代码 // *

// * 集成了job-elastic模块之后 会产生2个datasource * dataSource * tracingDataSource // *

// * 主要解决 这个冲突的问题 // */ // @Configuration(proxyBeanMethods = false) // @ConditionalOnProperty(prefix = "spring.quartz", name = "job-store-type", havingValue = // "jdbc") // @Import(DatabaseInitializationDependencyConfigurer.class) // protected static class JdbcStoreTypeConfiguration { // // @Bean // @Order(0) // public SchedulerFactoryBeanCustomizer dataSourceCustomizer( // org.springframework.boot.autoconfigure.quartz.QuartzProperties properties, // @Qualifier("dataSource") DataSource dataSource, // @QuartzDataSource ObjectProvider quartzDataSource, // ObjectProvider transactionManager, // @QuartzTransactionManager ObjectProvider // quartzTransactionManager) { // return (schedulerFactoryBean) -> { // DataSource dataSourceToUse = getDataSource(dataSource, quartzDataSource); // schedulerFactoryBean.setDataSource(dataSourceToUse); // PlatformTransactionManager txManager = getTransactionManager(transactionManager, // quartzTransactionManager); // if (txManager != null) { // schedulerFactoryBean.setTransactionManager(txManager); // } // }; // } // // private DataSource getDataSource(DataSource dataSource, // ObjectProvider quartzDataSource) { // DataSource dataSourceIfAvailable = quartzDataSource.getIfAvailable(); // return (dataSourceIfAvailable != null) ? dataSourceIfAvailable : dataSource; // } // // private PlatformTransactionManager getTransactionManager( // ObjectProvider transactionManager, // ObjectProvider quartzTransactionManager) { // PlatformTransactionManager transactionManagerIfAvailable = // quartzTransactionManager.getIfAvailable(); // return (transactionManagerIfAvailable != null) ? transactionManagerIfAvailable // : transactionManager.getIfUnique(); // } // // @Bean // @SuppressWarnings("deprecation") // @ConditionalOnMissingBean({QuartzDataSourceScriptDatabaseInitializer.class, // QuartzDataSourceInitializer.class}) // @Conditional(OnQuartzDatasourceInitializationCondition.class) // public QuartzDataSourceScriptDatabaseInitializer quartzDataSourceScriptDatabaseInitializer( // DataSource dataSource, @QuartzDataSource ObjectProvider quartzDataSource, // org.springframework.boot.autoconfigure.quartz.QuartzProperties properties) { // DataSource dataSourceToUse = getDataSource(dataSource, quartzDataSource); // return new QuartzDataSourceScriptDatabaseInitializer(dataSourceToUse, properties); // } // // static class OnQuartzDatasourceInitializationCondition extends // OnDatabaseInitializationCondition { // // OnQuartzDatasourceInitializationCondition() { // super("Quartz", "spring.quartz.jdbc.initialize-schema"); // } // // } // // } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy