• java定时任务


    @Scheduled(fixedDelay = xx)

    可能出现的问题

    @Scheduled注解有可能失效,即不执行定时任务
    可能的原因

    1. 服务器时间变更
    2. 任务执行失败导致后续不再执行

    解决方案:使用ScheduledExecutorService

           // 创建一个ScheduledThreadPoolExecutor,其中包含3个线程,线程个数根据实际业务量确定
            ScheduledExecutorService executor = Executors.newScheduledThreadPool(3);
    
            // 创建一个定时任务,每隔一秒执行一次
            Runnable task = () -> {
                //这里放业务逻辑
                System.out.println("定时任务执行了,当前时间:" + System.currentTimeMillis());
            };
    
            // 延迟1秒后执行任务,并且每隔1秒重复执行
            executor.scheduleAtFixedRate(task, 1, 1, TimeUnit.SECONDS);
    
            // 让主线程休眠10秒,以便观察定时任务的执行
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
            // 关闭定时任务执行器
            executor.shutdown();
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    定时任务中的一些基础知识

    ScheduledExecutorService 不同的执行决策
    scheduleAtFixedRate:任务之间不会互相影响
    scheduleWithFixedDelay:上一个任务执行完才会继续执行另一个,也就是说,如果前一个执行失败,那么下一个任务就不会继续执行

    上面两个决策在@Scheduled中对应@Scheduled(fixedDelay = 5000)和@Scheduled(fixedRate = 5000),在Scheduled注解中,除了使用以上两种决策,还可以使用定时任务中的cron表达式

    corn表达式

    一个单元格代表一个位置

    位置星期年(可选)
    取值0-590-590-231-311-120-7,0和7:周日年(可选)

    特殊字符可以出现的位置

    特殊字符\位置星期年(可选)
    *
    -:用于表示一个范围
    , :类似于枚举
    /:每隔多久
    ? :不指定特定值
    L:取值范围中最后一个
    W:最近一天
    #:第几个

    不考虑可选配置的情况下:
    可以出现在任意位置的特殊字符:*、-、,
    只能出现在日期和星期的特殊字符:?、L
    只能出现在一个位置的特殊字符:W、#
    不能出现在星期以外的位置:/

  • 相关阅读:
    一文知晓Linux文件权限
    期货价值计算方法(期货的价值怎么计算)
    java-php-python-ssm-养老机构服务信息管理-计算机毕业设计
    Docker数据卷
    二叉树的操作大全
    Vue中的.sync修饰符
    【矩阵论】2. 矩阵分解——正规分解
    基于Java在线交友系统设计实现(源码+lw+部署文档+讲解等)
    重生之初识svelte框架(1)
    Android热修复Sophix的使用
  • 原文地址:https://blog.csdn.net/shuo_haiying/article/details/133695504