前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >springboot自带定时任务和集成quartz

springboot自带定时任务和集成quartz

作者头像
大数据流动
发布2019-08-08 11:43:15
1.7K0
发布2019-08-08 11:43:15
举报
文章被收录于专栏:实时计算

1,springboot自带的定时任务 默认是单线程

有这个依赖就可以

代码语言:javascript
复制
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>

在启动类加注解 @EnableScheduling

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

2,把springboot自带配成多线程

加一个类

代码语言:javascript
复制
@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
加依赖
代码语言:javascript
复制
<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.2.1</version>
</dependency>

写一个任务 继承Job就可以   自己的业务写在这
代码语言:javascript
复制
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执行任务
代码语言:javascript
复制
@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调用任务启动  或者用其他方式启动
代码语言:javascript
复制
@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();
    }
}
代码语言:javascript
复制
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-08-14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档