动态调整xxl_job下次执行时间

news2024/11/24 10:13:40

项目场景:

目前项目引入了 xxl-job 来跑定时任务,但是存在一个问题,项目执行结束的时间不固定,有峰值,在高峰期的时候会出现长阻塞一直排队等待,如图:

在这里插入图片描述


问题描述

需要做一种策略来解决长阻塞问题,精准控制下一次执行时间,尽量保证不空档


原因分析:

1.上游接口的接口限流或者峰值压力导致返回超时
2.高峰期数据量达到峰值处理不过来
3.设置的执行间隔太短,执行不过来


解决方案:

思路

        编写一个cron表达式,时间一分钟一次,直接获取当前时间的下一次执行时间,并且更新到xxl-job的执行日志里面

注意

        1.因为设置的1分钟59秒,所以在秒的位置设置了59,防止在59秒执行完更新超时,导致定时任务执行过时间

        2.xxlJobInfo.setTriggerStatus(1); 设置这个,只需要点击立即执行就可以让它运行,但是后续可能需要加一个开关来控制需要执行的策略是一次或者多次

        3.在xxl_job_info中schedule_conf是编写cron表达式,但是trigger_next_time才是下次执行时间,需要转为时间戳更新

实现方法

package com.tthk.inland.ticket.core.service.xxlJobInfo.impl;

import com.tthk.inland.ticket.core.configurations.druidconfig.DataSource;
import com.tthk.inland.ticket.core.entity.xxlJobInfo.XxlJobInfo;
import com.tthk.inland.ticket.core.mapper.xxlJobInfo.XxlJobInfoMapper;
import com.tthk.inland.ticket.core.service.xxlJobInfo.IXxlJobInfoService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.tthk.inland.ticket.core.utils.cron.CronUtils;
import com.xxl.job.core.context.XxlJobHelper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author Foam
 * @since 2023-05-31
 */
@Slf4j
@Service
public class XxlJobInfoServiceImpl extends ServiceImpl<XxlJobInfoMapper, XxlJobInfo> implements IXxlJobInfoService {

    @DataSource("xxlJobs")
    public void updateCronTime(){
        try{
            // 更新下一次cron时间
            final var nextTime = CronUtils.getExecutionTimeByNum("59 0/1 * * * ?", 1).get(0);
            final var nextCron = CronUtils.getCronByTimeString(nextTime);
            final var xxlJobInfo = new XxlJobInfo();
            xxlJobInfo.setId(74);
            xxlJobInfo.setScheduleConf(nextCron);
            final var simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            final var nextTimestamp = simpleDateFormat.parse(nextTime);
            xxlJobInfo.setTriggerNextTime(nextTimestamp.getTime());
            xxlJobInfo.setTriggerStatus(1);
            this.updateById(xxlJobInfo);
            XxlJobHelper.log("更新下一次cron时间"+nextCron);
        }catch (Exception e){
            log.error("cron解析异常",e);
        }
    }
}

工具类

package com.tthk.inland.ticket.core.utils.cron;

import org.springframework.scheduling.support.CronSequenceGenerator;

import java.text.SimpleDateFormat;
import java.time.DateTimeException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;

/**
 * @Description:cron表达式工具类
 * @date:2022/10/8_15:09
 * @author:Foam
 */
public class CronUtils {
    /**
     * 解析cron对应次数
     * @Author Foam
     * @Date 2023/1/6
     * @param cronStr cron 表达式
     * @param num 解析最近几次执行时间
     * @return List<String> 返回执行时间列表
     **/
    public static List<String> getExecutionTimeByNum(String cronStr, Integer num) {
        CronSequenceGenerator cronSequenceGenerator = new CronSequenceGenerator(cronStr, TimeZone.getTimeZone("Asia/Shanghai"));
        List<String> result = new ArrayList<>(num);
        Date date = new Date();
        for (Integer integer = 0; integer < num; integer++) {
            date = cronSequenceGenerator.next(date);
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String format1 = format.format(date);
            result.add(format1);
        }
        return result;
    }

    /**
     * @Description CN: 字符串解析cron表达式
     * @Description EN:
     * @Description KR:
     * @Author Foam
     * @Date 2023/5/29
     **/
    public static String getCronByTimeString(String times){
        DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        // 定义时间
        LocalDateTime dateTime = LocalDateTime.parse(times,dateTimeFormatter1);
        // 使用DateTimeFormatter格式化时间
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy MM dd HH mm ss");
        String format = dateTime.format(dateTimeFormatter);

        // 拆分字符串
        String[] dateTimeParts = format.split(" ");

        // 构建cron表达式
        return String.format("%s %s %s %s %s ? *",dateTimeParts[5],dateTimeParts[4],dateTimeParts[3],dateTimeParts[2],dateTimeParts[1],dateTimeParts[0]);
    }
}

效果

缺点

        1.需要指定执行器id,需要加参数配置,比较麻烦

        2.不适用集群模式下的任务

        3.开启和关闭需要用户理解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/600744.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

区块链理财源码【互联网畜牧业养牛平台】带积分商城+抽奖+会员特权【亲测】

源码简介&#xff1a; 互联网畜牧业的养牛平台&#xff0c;非常火的区块链农业应用&#xff0c;是养殖业元宇宙的一种理财商业模式&#xff0c;农业类的其实都可以借鉴这种思路。当然了&#xff0c;玩法比较多样&#xff0c;不要做违法的事情就行。 代码已经简单亲测了一下&a…

linuxOPS基础_linux文本文件查看及统计

vi/vim vim文档编辑操作太多了,可以看这篇单独介绍vim的文章>https://blog.csdn.net/weixin_44368963/article/details/130963920 cat查看文件 命令&#xff1a;cat 作用&#xff1a;查看文件内容 语法&#xff1a;#cat 文件名称 ​ #cat 文件1 文件2 > 文件3 **特别注…

docker入门(1)----服务/镜像/容器/数据卷相关命令

安装 官网安装app命令行安装&#xff08;但是没有图形界面app&#xff09;brew install docker 架构 镜像&#xff08;Image&#xff09;&#xff1a;Docker 镜像&#xff08;Image&#xff09;&#xff0c;就相当于是一个 root 文件系统。比如官方镜像ubuntu:16.04 就包含了…

chatgpt赋能python:Python内置排序:快速高效的数据处理方式

Python内置排序&#xff1a;快速高效的数据处理方式 作为一种非常流行的编程语言&#xff0c;Python提供了很多高效、易于使用的内置功能&#xff0c;其中之一就是排序函数。通过使用内置的排序函数&#xff0c;Python工程师可以快速高效地处理各种不同类型的数据&#xff0c;…

什么是DAS/SAN/NAS

先上图 DAS DAS(Direct-attached Storage) 直连存储&#xff0c;这种存储设备通常是一个磁盘阵列柜&#xff0c;里面有多块磁盘&#xff0c;但不带RAID功能。 它与服务器主机之间的连接通常采用SCSI或者FC连接。DAS只能连接一台服务器&#xff0c;其它服务器无法共享该存储。 …

Redisson

文章目录 Redisson背景简介使用引入依赖配置类源代码 Redisson 背景 基于Redis(setnx)实现的分布式锁存在以下几个问题&#xff1a; 不可重入&#xff1a;同一个线程无法多次获取同一把锁 不可重试&#xff1a;获取锁只尝试一次就返回false&#xff0c;没有重试机制 超时释…

云服务器+minio+PicGo+Typora搭建个人图床实现typora鼠标右击上传图片。

搭建图床 服务器配置docker安装minio安装配置docker安装minio配置minio picgo配置下载picgopicgo配置去插件市场下载&#xff0c;minio配置 typora配置安装破解设置上传服务 服务器配置 本人用的是阿里云的轻量型云服务器&#xff0c;centos7.6&#xff0c;没有服务器的可以自…

让文物“活”起来,火山引擎视频云三维重建技术揭秘

动手点关注 干货不迷路 中国历史悠久&#xff0c;文化底蕴深厚&#xff0c;文物数目众多&#xff0c;文物作为前人智慧的结晶&#xff0c;其文献价值不言而喻。古籍是记录中华文明的重要载体&#xff0c;也是流传至今的宝贵文化遗产&#xff0c;文物保护也是一项长期重要的基础…

OpenAI最新研究Let's verify step-by-step,过程胜于结果!

深度学习自然语言处理 原创作者&#xff1a;Winni OpenAI最新研究 <Let’s verify step-by-step> 于昨天发布&#xff0c;引起了广泛关注。这个想法非常简单&#xff0c;可以用一句话来概括&#xff1a; 对于复杂的逐步推理问题&#xff0c;我们在每个步骤都给予奖励&…

用GANs来做数据增强

适用于只有很少样本的情况。 即使是不完美的合成数据也可以提高分类器的性能。 生成对抗网络(Generative adversarial networks&#xff0c;简称GANs)由Ian Goodfellow于2014年推出&#xff0c;近年来成为机器学习研究中非常活跃的话题。GAN是一种无监督生成模型&#xff0c;它…

光栅尺磁栅尺编码器AB信号输入4倍频脉冲计数器,Modbus RTU模块

IBF153远程I/O模块&#xff0c;可以用来测量1路光栅尺磁栅尺编码器信号。 信号输入 1路光栅尺磁栅尺编码器信号输入&#xff0c;可接NPN和PNP信号&#xff0c;通过命令设置输入类型。 通讯协议 通讯接口&#xff1a; 1路标准的RS-485通讯接口。 通讯协议&#xff1a;支持两…

一篇文章搞定《Android嵌套滑动》

一篇文章搞定《Android嵌套滑动》 前言嵌套滑动冲突种类产生原因1、外部与内部滑动方向不一致2、外部与内部滑动方向一致3、多种情况下的嵌套&#xff08;电商首页&#xff09; 解决嵌套滑动的方法1、外部拦截法2、内部拦截法3、现有API框架 外部与内部滑动方向不一致1、ViewPa…

MySQL第三章、表的增删查改

目录 一、CRUD 二、新增&#xff08;Create&#xff09; 2.1单行数据 全列插入 ​2.2多行数据 指定列插入 ​编辑 三、查询&#xff08;Retrieve&#xff09; ​3.1全列查询 3.2指定列查询 3.3 查询字段为表达式 3.4 别名 3.5 去重&#xff1a;DISTINCT 3.6 排序…

docker-compose安装 rocketmq server、dashboard

目录 目录结构 nameserver安装 broker安装 控制台安装 测试效果 rocket分为3个服务&#xff1a;nameserver、broker、dashboard 这边我计划分开安装&#xff1a; 安装版本为4.5.0 目录结构 规划的结构 命令 mkdir -p /apps/rocketmq/namesrv/{config,data,logs} mkdir…

自动化测试-终章

自动化测试-终章 前沿 如果想做不需要人去点击使用程序做到真正的自动化测试思想,以下是我的思想,需要跟着我的思路来,我们做一个可以测试所有页面的增删改查功能是否好使 思想一 我使用的是Java 做自动化测试,我们现做一个简单的自动化 pom 需要引入 selenium-java 然后需…

Qt中的窗口类及其特点

目录 常用的窗口类 窗口的显示内嵌窗口 QWidget内嵌窗口演示 QWidget不内嵌窗口演示 QDialog类型的窗口特点 QMainWindows窗口的特点 总结 常用的窗口类 常用的窗口类有 3 个 在创建 Qt 窗口的时候&#xff0c;需要让自己的窗口类继承上述三个窗口类的其中一个QWidget 所有…

增量数据抽取技术

写在前面 本文隶属于专栏《大数据从 0 到 1》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和文献引用请见《大数据从 0 到 1》 正文 在数据仓库中要实现增量抽取&#x…

STL-string-1

stoi int stoi (const string& str, size_t* idx 0, int base 10);int stoi (const wstring& str, size_t* idx 0, int base 10); Convert string to integer 解析str&#xff0c;将其内容解释为指定基数的整数&#xff0c;该整数作为int值返回。 如果idx不是空…

QLoRa:在消费级GPU上微调大型语言模型

大多数大型语言模型(LLM)都无法在消费者硬件上进行微调。例如&#xff0c;650亿个参数模型需要超过780 Gb的GPU内存。这相当于10个A100 80gb的gpu。就算我们使用云服务器&#xff0c;花费的开销也不是所有人都能够承担的。 而QLoRa (Dettmers et al.&#xff0c; 2023)&#x…

公司裁员不给赔偿怎么办?

阅读本文大概需要 1.61 分钟。 最近在星球回答球友问题的时候&#xff0c;发现不少人都提到裁员这个话题。 有球友说他们公司在裁员&#xff0c;但不想给赔偿。 领导给他的方案是把年假调休休了&#xff0c;然后再给三周找工作时间&#xff0c;这三周不用打卡&#xff0c;三周后…