当前位置: 首页 > news >正文

springboot 使用 @Scheduled 注解实现任务调度 以及相关踩坑记录

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

关于spring boot 实现任务调度的方法有很多种,这里不再赘述。

首先pom只需引入

<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.2.1</version>
</dependency>

然后application开启@EnableScheduling

@SpringBootApplication
@EnableAsync
@EnableScheduling
public class Application extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }

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


}

之后用嘛就很简单了

@Component
@Configurable
public class TestONE {
    private Logger logger = (Logger) LoggerFactory.getLogger(TestONE.class);

    @Scheduled(cron = "0/5 * * * * ? ")
//    @Async
    public  void test1() {
        logger.error("任务1--开始");
        try {
            Thread.sleep(20000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        logger.error("任务1---结束");
    }

========分隔线=========

首先大致说下遇到过的问题

Q1:启动后修改本地时间但是调度任务不再执行

  A:之前大致看了一下这块的介绍,其实启动之后虚拟机内维持一个时间计数器,这个是启动时与系统时间同步过的,当让会有一个专门管理调度任务的,按照虚拟机时间以及系统时间核对(如果这出现不一致肯定不执行了),如果一致那么也满足cron规则就开启执行。

Q2:出现漏执行的情况

A:我目前了解到其实spring的@Scheduled默认是单线程的,也就是说一次只能执行一个定时任务,如果一但任务是耗时的那么后面的自动进入线程的挂起等待队列,当然这个队列也是有大小限制,如果执行中任务特别耗时挂起的超过限制那么后面的任务都不会执行。

        很多大企是很注重调度任务的可用性,因为毕竟对于任务调度这个事情来说里面涉及到的业务肯定都是有价值甚至很重要的。特别公司发展的一定程度调度任务的重要性非常的高。所以如果还是单节点的架构的调度的话建议还是上高可用的调度吧,那么关于高可用的调度任务网上还是有好几个解决方案以供选择,其实最核心的一点哪怕是多节点调度也是单一机器去执行调度任务,也就要求做到分布式锁,一般来讲redis 或者 zookeeper就可以很好的实现这块。当然还有一个很重要的事儿就是关于调度任务失败的重调。个人推荐elastic-job这个组件,可以自行研究对比后选择适合自己公司业务的。

        针对以上调度线程是单线程问题其实也可以通过,设置执行线程数目,建议开启的线程池核心线程不要过高,毕竟cpu也就那么多个核心,线上项目又肯定不是自己一个的。何况还有维护系统其他组件等的线程。个人感觉视自己项目里调度数量和执行时间决定。单一时间段内不会出现跑满即可。

/**
 * @author qiaolu
 */
@Configuration
public class ScheduledConfig implements SchedulingConfigurer {

    @Override
    public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
        scheduledTaskRegistrar.setScheduler(setTaskExecutors());
    }

    @Bean
    public Executor setTaskExecutors() {
        return newScheduledThreadPool(2);
    }
}

当然针对耗时较长的调度任务其实完成可以这样解决:加上 @Async

spring会把这个方法另开启一个线程去处理,以达到异步处理的效果,这样调度任务也会快速。当然没必要给所有调度都这么加。

@Scheduled(cron = "0/5 * * * * ? ")
@Async
public  void test1() {
    logger.error("任务1--开始");
    try {
        Thread.sleep(20000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    logger.error("任务1---结束");
}

好了 大致就是以上的几点,基本也就满足中小企业遇到的调度问题。当然也可能有描述不准确或者不全面的地方,欢迎指正,哈哈。

转载于:https://my.oschina.net/u/2337666/blog/1929365

相关文章:

  • centos虚拟机安装,配置静态ip可以访问网络
  • java倒序按行读文本文件ReversedLinesFileReader
  • 打造RecyclerView的n级列表
  • python之异常处理模块
  • 微服务通信策略
  • 《Python从小白到大牛》第9章 数据结构
  • 写给33岁的自己:为之奋斗一生的事业
  • ElasticSearch6.3.2------入门
  • 技术团队
  • 阿里云表格存储使用教程
  • ROS设备的性价比图
  • jQuery跳转到页面指定位置
  • PMP每日一题
  • TimesTen数据库的备份和恢复
  • ARMS V2.4.4 发布,自定义监控商业化发布
  • hexo+github搭建个人博客
  • 【5+】跨webview多页面 触发事件(二)
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • C++类的相互关联
  • HTTP那些事
  • PAT A1017 优先队列
  • PHP CLI应用的调试原理
  • Python_OOP
  • react 代码优化(一) ——事件处理
  • ubuntu 下nginx安装 并支持https协议
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 写给高年级小学生看的《Bash 指南》
  • 栈实现走出迷宫(C++)
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • (4)STL算法之比较
  • (C#)获取字符编码的类
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (pojstep1.1.2)2654(直叙式模拟)
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (一)RocketMQ初步认识
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .dwp和.webpart的区别
  • .Net Remoting(分离服务程序实现) - Part.3
  • [AutoSar]BSW_Memory_Stack_003 NVM与APP的显式和隐式同步
  • [BZOJ 1032][JSOI2007]祖码Zuma(区间Dp)
  • [CISCN2019 华东南赛区]Web4
  • [CodeForces-759D]Bacterial Melee
  • [C语言]编译和链接
  • [Django ]Django 的数据库操作
  • [NOI2022] 众数 题解
  • [PHP]严格类型
  • [python] RRT快速拓展随机树