springboot自帶定時任務和集成quartz

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();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章