關於springboot Schedule定時任務同一時刻只執行一個任務的問題


我寫了一個簡單的任務bean,兩個執行任務,時間是同一時刻,在數據庫模式下只執行了一個任務。改為內存模式即可解決問題

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

/**
 * 測試定時任務(演示Demo,可刪除)
 * <p>
 * testTask為spring bean的名稱
 *
 * @author crazySea
 * @email 960236576@qq.com
 */
@Component("testTask")
public class TestTask implements ITask {
    private Logger logger = LoggerFactory.getLogger(getClass());

    @Override
    public void run(String params) {
        logger.debug("TestTask定時任務正在執行,參數為:{}", params);
    }
}

解決方案如下:

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;

import javax.sql.DataSource;
import java.util.Properties;

/**
 * 定時任務配置
 *  默認是單線程執行的,同一個時間觸發的是串行執行的
 *  使用內存模式就可以同一時刻執行多個任務
 * @author KURO
 */
@Slf4j
@Configuration
public class ScheduleConfig{

    @Bean
    public SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource) {
        SchedulerFactoryBean factory = new SchedulerFactoryBean();
//        factory.setDataSource(dataSource);

        //quartz參數
        Properties prop = new Properties();
        prop.put("org.quartz.scheduler.instanceName", "SlowcomScheduler");
        prop.put("org.quartz.scheduler.instanceId", "AUTO");
        //線程池配置
        prop.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool");
        prop.put("org.quartz.threadPool.threadCount", "20");
        prop.put("org.quartz.threadPool.threadPriority", "5");
        //JobStore配置
        //使用數據庫定時任務
//        prop.put("org.quartz.jobStore.class", "org.quartz.impl.jdbcjobstore.JobStoreTX");
        //使用內存定時任務
        prop.put("org.quartz.jobStore.class", "org.quartz.simpl.RAMJobStore");
//        //集群配置
//        prop.put("org.quartz.jobStore.isClustered", "true");
//        prop.put("org.quartz.jobStore.clusterCheckinInterval", "15000");
//        prop.put("org.quartz.jobStore.maxMisfiresToHandleAtATime", "1");
//
//        prop.put("org.quartz.jobStore.misfireThreshold", "12000");
//        prop.put("org.quartz.jobStore.tablePrefix", "QRTZ_");
//        prop.put("org.quartz.jobStore.selectWithLockSQL", "SELECT * FROM {0}LOCKS UPDLOCK WHERE LOCK_NAME = ?");

        //PostgreSQL數據庫,需要打開此注釋
        //prop.put("org.quartz.jobStore.driverDelegateClass", "org.quartz.impl.jdbcjobstore.PostgreSQLDelegate");

        factory.setQuartzProperties(prop);

        factory.setSchedulerName("SlowcomScheduler");
        //延時啟動
        factory.setStartupDelay(0);
//        factory.setApplicationContextSchedulerContextKey("applicationContextKey");
//        //可選,QuartzScheduler 啟動時更新己存在的Job,這樣就不用每次修改targetObject后刪除qrtz_job_details表對應記錄了
//        factory.setOverwriteExistingJobs(true);
        //設置自動啟動,默認為true
        factory.setAutoStartup(true);

        return factory;
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM