首页 > 编程语言 >Java基于XXLJOB的定时任务实现阶梯式通知方式

Java基于XXLJOB的定时任务实现阶梯式通知方式

时间:2024-08-05 14:55:19浏览次数:10  
标签:pushInfo COMMENT NULL Java DEFAULT 阶梯式 push XXLJOB order

数据库表设计

CREATE TABLE `tx_order_push_info` (
  `order_no` varchar(64) DEFAULT NULL COMMENT '交易单号',
  `order_id` decimal(11,0) DEFAULT NULL COMMENT '交易单Id',
  `push_status` decimal(2,0) DEFAULT NULL COMMENT '推送状态',
  `push_count` decimal(2,0) DEFAULT NULL COMMENT '推送次数',
  `push_address` varchar(255) DEFAULT NULL COMMENT '推送地址',
  `request_body` varchar(1000) DEFAULT NULL COMMENT '推送报文',
  `next_push_time` datetime DEFAULT NULL COMMENT '下次通知时间',
  `mid` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `create_time` datetime DEFAULT NULL COMMENT '录入时间',
  `update_time` datetime DEFAULT NULL COMMENT '修改时间',
  PRIMARY KEY (`mid`),
  KEY `tx_order_push_info_order_no_IDX` (`order_no`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=406 DEFAULT CHARSET=utf8mb4 COMMENT='支付成功推送记录';

xxl-job配置定时任务策略

注意xxl-job在执行定时任务的时候会丢入参数:10/30/60/300/600/1200/1800/3600 阶梯式通知的时间间隔就和他有关系

准备的表tx_order_push_info里面有两个重要的参数:当前通知次数、下次通知时间

所以想要这种阶梯式通知实现--就很简单了:定时任务还是正常的固定每段时间间隔去执行,但是查询需要执行的数据会有当前时间是否大于下次执行时间的条件过滤,只有满足的数据才会被取出来执行。不满足的就不执行

代码实现

@XxlJob("retryPayNotifyExceptionMsg")
    public ReturnT<String> retryPayNotifyExceptionMsg(String params) {
        String[] timeSplit = params.split("/");
        // 当前服务器索引
        int shardIndex = XxlJobContext.getXxlJobContext().getShardIndex();
        // 总服务器数
        int shardTotal = XxlJobContext.getXxlJobContext().getShardTotal();
        OrderPushInfo orderPushInfo = new OrderPushInfo();
        orderPushInfo.setPushStatus(PushStatusEnum.InitLoading.getCode());
        // 分页参数
        PageParameter pageParameter = new PageParameter();
        // 本次任务需要处理的数据等于默认分页大小*调度任务服务器数量
        pageParameter.setPagesize(20);
        pageParameter.setCurrentPage(1);
        List<OrderPushInfo> orderPushInfos = orderPushInfoService.listByPage(orderPushInfo, pageParameter);
        if (CollectionUtils.isNotEmpty(orderPushInfos)) {
            for (OrderPushInfo pushInfo : orderPushInfos) {
                // 分片处理
                if (shardIndex != (pushInfo.getMid() % shardTotal)) {
                    continue;
                }
                handlerRetrySendMsg(pushInfo, timeSplit);
            }
        }
        return ReturnT.SUCCESS;
    }

    private void handlerRetrySendMsg(OrderPushInfo pushInfo, String[] timeSplit) {
        Integer pushCount = pushInfo.getPushCount();
        if (pushCount >= timeSplit.length) {
            // 大于八次---丢弃
            pushInfo.setPushStatus(PushStatusEnum.MaxRetryGiveUp.getCode());
            orderPushInfoService.update(pushInfo);
            return;
        }
        // 发送时间是否符合预期
        Date nextPushTime = pushInfo.getNextPushTime();
        if (nextPushTime.before(new Date())) {
            // 重新发送消息
            pushCount++;
            try {
                Map<String, String> header = new HashMap<>();
                header.put("token", PBECoder.encrypt(token));
                HttpUtil.doPost(pushInfo.getPushAddress(), pushInfo.getRequestBody(), header);
                pushInfo.setPushStatus(PushStatusEnum.Success.getCode());
            } catch (Exception e) {
                log.error(pushInfo.getOrderNo() + "消息通知失败重试---次数" + pushCount);
            }
            pushInfo.setNextPushTime(DateUtil.addDateSecond(new Date(), Integer.parseInt(timeSplit[pushCount - 1])));
            pushInfo.setPushCount(pushCount);
            orderPushInfoService.update(pushInfo);
        }

    }

标签:pushInfo,COMMENT,NULL,Java,DEFAULT,阶梯式,push,XXLJOB,order
From: https://www.cnblogs.com/gtnotgod/p/18343242

相关文章

  • Java RMI技术详解与案例分析
    JavaRMI(RemoteMethodInvocation)是一种允许Java虚拟机之间进行通信和交互的技术。它使得远程Java对象能够像本地对象一样被访问和操作,从而简化了分布式应用程序的开发。一些应用依然会使用RMI来实现通信和交互,今天的内容我们来聊聊RMI的那些事儿。一、先来了解一下概念RMI......
  • java笔记4
    7.封装封装是面向对象编程的四大基本特性之一,它将对象的数据(属性)和行为(方法)组合在一起,并隐藏内部的实现细节。何为封装封装是创建对象的过程,确保对象的内部状态只能通过对象提供的方法来访问和修改。访问修饰符private关键字private修饰的成员只能在类的内部访问,不能被......
  • 2024最全 Java 面试八股文(程序员必备)
     一、Java基础篇1.接口和抽象类的区别相似点:(1)接口和抽象类都不能被实例化(2)实现接口或继承抽象类的普通子类都必须实现这些抽象方法不同点:(1)抽象类可以包含普通方法和代码块,接口里只能包含抽象方法,静态方法和默认方法,(2)抽象类可以有构造方法,而接口没有(3)抽象类中的成员变......
  • SpringBoot-书店信息管理系统+93494(免费领源码+开发文档)可做计算机毕业设计JAVA、PHP
    基于springboot书店信息管理系统摘 要书店信息管理系统采用B/S结构、java开发语言、以及Mysql数据库等技术。系统主要分为管理员和用户两部分,管理员管理主要功能包括:首页、轮播图、公告栏、资源管理(图书资讯、资讯分类)交流管理(留言板、留言板分类)系统用户(管理员、顾客用户......
  • Jupyter设置IJava内核(VSCode)
    VScode使用Jupyter并设置IJava内核VScode使用JupyterVScode使用Jupyter需要安装相应插件安装后效果如下:IJavaIJava是一个JupyterKernel,允许你在JupyterNotebook中运行Java代码。详情可在IJava的Github地址中了解安装IJava内核需要Java9或更高版本。(如果当......
  • Java --- Stream
    Java8引入了StreamAPI,它提供了一种高效且易于表达的方式来处理集合数据。StreamAPI允许你以声明式的方式处理数据,支持函数式编程风格,使得代码更加简洁和易读。以下是关于JavaStream流的详细介绍:1.Stream流的基本概念Stream流是对集合(Collection)数据进行操作的......
  • Java RMI技术详解与案例分析
    JavaRMI(RemoteMethodInvocation)是一种允许Java虚拟机之间进行通信和交互的技术。它使得远程Java对象能够像本地对象一样被访问和操作,从而简化了分布式应用程序的开发。一些应用依然会使用RMI来实现通信和交互,今天的内容我们来聊聊RMI的那些事儿。一、先来了解一下概......
  • Java中学习绘制流程图
    绘制程序流图目录绘制程序流图流程图的基本步骤和方法流程图中的图形符号及其作用:示例流程图:流程图的基本步骤和方法程序流程图(Flowchart)是一种图形化表示程序逻辑的方式,它使用一系列标准化的图形符号来表示算法或工作流程中的步骤和决策点。以下是绘制程序流程图的基本步骤和......
  • Java流程控制语句结构--跳转语句
    目录1.break语句2.continue语句3.return语句Java中的跳转语句主要用于控制程序的执行流程,使程序能够跳过某些语句或提前结束循环。Java中主要的跳转语句包括break、continue和return(虽然return通常用于从方法中返回,但在某些上下文中也可以视为一种跳转)。下面分别介绍这些跳转......
  • 一个基于Java的接口快速开发框架!无需编写代码,通过UI界面编写接口!
    大家好,我是Java陈序员。随着技术框架的不断发展更新,在日常开发中,我们可以借助一些第三方框架来快速实现接口开发,如MyBatis-Plus.但是这些框架工具,往往需要定义大量的Java对象类!今天,给大家介绍一个基于Java实现的接口快速开发框架,无需定义Java对象,通过Web界面完成接口编......