zoukankan      html  css  js  c++  java
  • 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();
    }
    }



  • 相关阅读:
    iOS UITextField 设置内边距
    在网页中嵌入任意字体的解决方案
    基数等比,确定进制
    改善CSS编码的5个在线幻灯片教程
    head区的代码详解
    一个简单的、循序渐进的CSS幻灯片教程
    功能强大易用的Web视频播放器——Flowplayer(使用方法及演示)
    CSS:区分IE版本的三个方法
    CSS书写标准及最佳实践
    Sliding Photograph Galleries
  • 原文地址:https://www.cnblogs.com/tree1123/p/9475302.html
Copyright © 2011-2022 走看看