热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

SpringBoot2taskscheduler定时任务调度器四种方式

这篇文章主要介绍了SpringBoot2taskscheduler定时任务调度器四种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

使用@EnableScheduling方式

@Component
@Configurable
@EnableScheduling
public class Task1 {
  private static Log logger = LogFactory.getLog(Task1.class);
  @Scheduled(cron = "0/2 * * * * * ")
  public void execute() {
    logger.info("Task1>>" + new Date());
  }
}

xml配置方式

application 启动加入读取 xml 文件

@SpringBootApplication
@ImportResource(value = { "classpath:applicationContext*.xml" })
public class Springboot2TaskApplication {

  public static void main(String[] args) {
    SpringApplication.run(Springboot2TaskApplication.class, args);
  }
}


 

  
  

@Service
public class Task2 {
  private static Log logger = LogFactory.getLog(Task2.class);
  public void method2() {
    logger.info("Task2----method2>>>>" + new Date());
  }
}

bean创建工厂方式

使用到的 jar 包


  org.springframework
  spring-context-support


  org.springframework
  spring-tx


  org.quartz-scheduler
  quartz
  2.3.0

新建 SchedledConfiguration.java 文件

@Configuration
public class SchedledConfiguration {

  /**
   * attention:
   * Details:配置定时任务
   */
  @Bean(name = "jobDetail")
  public MethodInvokingJobDetailFactoryBean detailFactoryBean(Task3 task) {// TestTask为需要执行的任务
    MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean();
    /*
     * 是否并发执行
     * 例如每5s执行一次任务,但是当前任务还没有执行完,就已经过了5s了,
     * 如果此处为true,则下一个任务会执行,如果此处为false,则下一个任务会等待上一个任务执行完后,再开始执行
     */
    jobDetail.setConcurrent(false);

    // 设置任务的名字
    jobDetail.setName("jobDetailName");

    // 设置任务的分组,这些属性都可以存储在数据库中,在多任务的时候使用
    jobDetail.setGroup("jobDetailGroup");

    /*
     * 为需要执行的实体类对应的对象
     */
    jobDetail.setTargetObject(task);

    /*
     * 通过这几个配置,告诉JobDetailFactoryBean我们需要执行定时执行ScheduleTask类中的task方法
     */
    jobDetail.setTargetMethod("task");
    return jobDetail;
  }

  /**
   * Details:配置定时任务的触发器,也就是什么时候触发执行定时任务
   */
  @Bean(name = "jobTrigger")
  public CronTriggerFactoryBean cronJobTrigger(JobDetail jobDetail) {
    CronTriggerFactoryBean tigger = new CronTriggerFactoryBean();
    tigger.setJobDetail(jobDetail);
    // 初始时的cron表达式,可以改成从数据库中获取
    tigger.setCronExpression("0/2 * * * * ?");
    // trigger的name
    tigger.setName("tiggerName");
    return tigger;

  }

  /**
   * Details:定义quartz调度工厂
   */
  @Bean(name = "scheduler")
  public SchedulerFactoryBean schedulerFactory(Trigger trigger) {
    SchedulerFactoryBean bean = new SchedulerFactoryBean();
    // 用于quartz集群,QuartzScheduler 启动时更新己存在的Job
    bean.setOverwriteExistingJobs(true);
    // 延时启动,应用启动1秒后
    bean.setStartupDelay(1);
    // 注册触发器
    bean.setTriggers(trigger);
    return bean;
  }
}

新建Task任务

@Service
public class Task3 {

  @Resource(name = "jobTrigger")
  private CronTrigger cronTrigger;

  @Resource(name = "scheduler")
  private Scheduler scheduler;

  private static Log logger = LogFactory.getLog(Task3.class);

  public void task() {
    logger.info("Task3---------" + new Date());
  }

  /**
   * 设置cron并重启定时器
   * @param cron cron值
   */
  public void setCron(String cron) {
    try {
      // 表达式调度构建器
      CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron);
      // 按新的cronExpression表达式重新构建trigger
      CronTrigger trigger = (CronTrigger) scheduler.getTrigger(cronTrigger.getKey());
      trigger = trigger.getTriggerBuilder().withIdentity(cronTrigger.getKey())
          .withSchedule(scheduleBuilder).build();
      // 按新的trigger重新设置job执行
      scheduler.rescheduleJob(cronTrigger.getKey(), trigger);
    } catch (SchedulerException e) {
      logger.info("cron表达式错误");
    }
  }
}

其中 setCron 方法可以进行重新设定任务调度时间

ThreadPoolTaskScheduler Runnable方式

public class Task4 implements Runnable {

  private ThreadPoolTaskScheduler threadPoolTaskScheduler;

  private static Log logger = LogFactory.getLog(Task4.class);

  @Override
  public void run() {
    logger.info("Task4================" + new Date());
  }

  /**
   * 设置cron并启动
   * @param cronExp cron值
   */
  public void reStart(String cronExp) {
    if (null != this.threadPoolTaskScheduler) {
      ScheduledExecutorService scheduledExecutorService = this.threadPoolTaskScheduler.getScheduledExecutor();
      if (!scheduledExecutorService.isShutdown()) {
        scheduledExecutorService.shutdownNow();
      }

      this.threadPoolTaskScheduler.destroy();
    }

    if (null != cronExp && cronExp.trim().length() > 0) {
      this.threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
      this.threadPoolTaskScheduler.setThreadNamePrefix("task4");
      this.threadPoolTaskScheduler.initialize();
      this.threadPoolTaskScheduler.schedule(this, new CronTrigger(cronExp));
    }
  }
}

其中reStart可以进行任务启动和重新设置任务调度时间,调用方式如下所示

/**
   * 初始化task4
   * 这里的代码不应该写在rest层上, 应该写在service层上
   */
  @PostConstruct
  private void initTask4() {
    //初始化task4任务调度器cron,可以从数据库中查询到cron值
    setTask4Cron("0/3 * * * * ?");
  }

  /**
   * 改变task4的cron
   * @param cron cron值
   * @return 成功标志
   */
  @RequestMapping(value = { "/setTask4Cron" }, method = RequestMethod.GET)
  @ResponseBody
  public String setTask4Cron(String cron) {
    if (null == task4) {
      task4 = new Task4();
    }

    task4.reStart(cron);
    return "success";
  }

initTask4 方法加了 @PostConstruct '注解,可以在项目启动时自动根据cron来启动任务, setTask4Cron 方法可以重新调置任务时间

四个任务的效果如下:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  •     这里使用自己编译的hadoop-2.7.0版本部署在windows上,记得几年前,部署hadoop需要借助于cygwin,还需要开启ssh服务,最近发现,原来不需要借助cy ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • iOS Swift中如何实现自动登录?
    本文介绍了在iOS Swift中如何实现自动登录的方法,包括使用故事板、SWRevealViewController等技术,以及解决用户注销后重新登录自动跳转到主页的问题。 ... [详细]
  • 本文介绍了使用SSH免密登录的步骤,包括生成公私钥、传递公钥给被登录机、修改文件权限的操作。同时提醒用户注意私钥的传递方式,建议使用U盘等离线方式传递。 ... [详细]
  • Java学习笔记之使用反射+泛型构建通用DAO
    本文介绍了使用反射和泛型构建通用DAO的方法,通过减少代码冗余度来提高开发效率。通过示例说明了如何使用反射和泛型来实现对不同表的相同操作,从而避免重复编写相似的代码。该方法可以在Java学习中起到较大的帮助作用。 ... [详细]
  • 原理:dismiss再弹出,把dialog设为全局对象。if(dialog!null&&dialog.isShowing()&&!(Activity.)isFinishing()) ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • LVS实现负载均衡的原理LVS负载均衡负载均衡集群是LoadBalance集群。是一种将网络上的访问流量分布于各个节点,以降低服务器压力,更好的向客户端 ... [详细]
  • 本文详细介绍了在Centos7上部署安装zabbix5.0的步骤和注意事项,包括准备工作、获取所需的yum源、关闭防火墙和SELINUX等。提供了一步一步的操作指南,帮助读者顺利完成安装过程。 ... [详细]
  • GSIOpenSSH PAM_USER 安全绕过漏洞
    漏洞名称:GSI-OpenSSHPAM_USER安全绕过漏洞CNNVD编号:CNNVD-201304-097发布时间:2013-04-09 ... [详细]
  • 本文介绍了在RHEL 7中的系统日志管理和网络管理。系统日志管理包括rsyslog和systemd-journal两种日志服务,分别介绍了它们的特点、配置文件和日志查询方式。网络管理主要介绍了使用nmcli命令查看和配置网络接口的方法,包括查看网卡信息、添加、修改和删除配置文件等操作。 ... [详细]
  • Python脚本编写创建输出数据库并添加模型和场数据的方法
    本文介绍了使用Python脚本编写创建输出数据库并添加模型数据和场数据的方法。首先导入相应模块,然后创建输出数据库并添加材料属性、截面、部件实例、分析步和帧、节点和单元等对象。接着向输出数据库中添加场数据和历程数据,本例中只添加了节点位移。最后保存数据库文件并关闭文件。文章还提供了部分代码和Abaqus操作步骤。另外,作者还建立了关于Abaqus的学习交流群,欢迎加入并提问。 ... [详细]
author-avatar
Luna--moon
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有