我寫了一個簡單的任務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;
}
}