springboot自帶定時任務和集成quartz


來源於  https://www.cnblogs.com/tree1123/p/9475302.html

1,springboot自帶的定時任務  默認是單線程

有這個依賴就可以

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>

在啟動類加注解 @EnableScheduling

然后在方法上  @Scheduled(cron="*/5 * * * * ?") 或者 @Scheduled(fixedRate = 5000)  就可以了  很簡單

 

 

2,把springboot自帶配成多線程

加一個類 

@Configuration
@EnableScheduling //開啟定時器
public class SchedulerConfig implements SchedulingConfigurer {

@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
//多線程配置
scheduledTaskRegistrar.setScheduler(taskExecutor());
}

@Bean
public Executor taskExecutor() {
return Executors.newScheduledThreadPool(100);
}

}

再用@Scheduled 起任務時 已經是多線程了



3,springboot集成quartz
加依賴
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>

寫一個任務 繼承Job就可以 自己的業務寫在這
public class QuartzJobDemo implements Job {

private static final Logger logger = LoggerFactory.getLogger(QuartzJobDemo.class);

@Override
public void execute(JobExecutionContext jobExecutionContext){
Thread current = Thread.currentThread();
logger.info("QuartzJobDemo.execute 定時任務Quartz:"+current.getId()+ ",name:"+current.getName());
}
}

搞一個Manager管理一下任務startJobDemo方法就是怎么用quartz執行任務
@Component
public class QuartzManager {
private static final Logger logger = LoggerFactory.getLogger(QuartzManager.class);

@Autowired
private Scheduler scheduler;

public void startJob() throws SchedulerException{
startJobDemo(scheduler);
}

private void startJobDemo(Scheduler scheduler) throws SchedulerException {
// 通過JobBuilder構建JobDetail實例,JobDetail規定只能是實現Job接口的實例
// JobDetail 是具體Job實例
JobDetail jobDetail = JobBuilder.newJob(QuartzJobDemo.class).withIdentity("job1", "group1").build();
// 基於表達式構建觸發器
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0/5 * * * * ?");
// CronTrigger表達式觸發器 繼承於Trigger
// TriggerBuilder 用於構建觸發器實例
CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("job1", "group1")
.withSchedule(cronScheduleBuilder).build();
scheduler.scheduleJob(jobDetail, cronTrigger);
scheduler.start();
}
public void removeJob(String jobName, String groupName) {
TriggerKey triggerKey = TriggerKey.triggerKey(jobName, groupName);
try {
if (checkExists(jobName, groupName)) {
scheduler.pauseTrigger(triggerKey);
scheduler.unscheduleJob(triggerKey);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}

public boolean checkExists(String jobName, String groupName) throws SchedulerException {
TriggerKey triggerKey = TriggerKey.triggerKey(jobName, groupName);
return scheduler.checkExists(triggerKey);
}

public void updateJob(String jobName, String groupName, String time){
TriggerKey triggerKey = TriggerKey.triggerKey(jobName, groupName);
try{
int fixedRate = Integer.valueOf(time)*1000;
SimpleTriggerImpl trigger = (SimpleTriggerImpl)scheduler.getTrigger(triggerKey);
if(trigger.getRepeatInterval() != fixedRate){
SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.repeatSecondlyForever(fixedRate);
Trigger newTrigger = TriggerBuilder.newTrigger().withIdentity(jobName, groupName)
.withSchedule(scheduleBuilder).build();

removeJob(jobName, groupName);
scheduler.rescheduleJob(triggerKey, newTrigger);
}
}catch (Exception e){
throw new RuntimeException(e);
}
}

}

可以用spring調用任務啟動 或者用其他方式啟動

@Configuration
@Component
public class StartQuartzJobListener implements ApplicationListener<ContextRefreshedEvent> {

private static final Logger logger = LoggerFactory.getLogger(StartQuartzJobListener.class);


@Autowired
private QuartzManager quartzManager;

/**
* 初始啟動quartz
*/
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
try {
quartzManager.startJob();
logger.info("定時任務已經啟動...");
} catch (SchedulerException e) {
e.printStackTrace();
}
}

/**
* 初始注入scheduler
* @return
* @throws SchedulerException
*/
@Bean
public Scheduler scheduler() throws SchedulerException{
SchedulerFactory schedulerFactoryBean = new StdSchedulerFactory();
return schedulerFactoryBean.getScheduler();
}
}

 
        


免責聲明!

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



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