数据库表设计

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);
} }

Java基于XXLJOB的定时任务实现阶梯式通知方式的更多相关文章

  1. Java 基于quartz实现定时 之一(注解方式配置)

    需要在项目里,导入quartz.jar package cn.zr.pringmvctest.trigger; import org.springframework.context.annotatio ...

  2. Spring基于SchedulingConfigurer实现定时任务

    Spring 基于 SchedulingConfigurer 实现定时任务,代码如下: import org.springframework.scheduling.annotation.Schedul ...

  3. spring 基于XML的申明式AspectJ通知的执行顺序

    spring 基于XML的申明式AspectJ通知的执行顺序 关于各种通知的执行顺序,结论:与配置文件中的申明顺序有关 1. XML文件配置说明 图片来源:<Java EE企业级应用开发教程&g ...

  4. Java基于内存的消息队列实现

    Java基于内存的消息队列实现 有需要源码的同学可以去Gitee上下载: https://gitee.com/hyxl-520/memory_message_queue 先看测试情况 需求背景 需求来 ...

  5. Golang、Php、Python、Java基于Thrift0.9.1实现跨语言调用

    目录: 一.什么是Thrift? 1) Thrift内部框架一瞥 2) 支持的数据传输格式.数据传输方式和服务模型 3) Thrift IDL 二.Thrift的官方网站在哪里? 三.在哪里下载?需要 ...

  6. Jenkins+Jmeter持续集成笔记(四:定时任务和邮件通知)

    通过前几篇文章,jmeter+ant+jenkins自动化持续构建的测试平台基本成型.既然要自动化平台,最基本的肯定要实现不经过人工干预,平台会在特定的条件下自动运行测试脚本,并在脚本运行结束后,发送 ...

  7. Java基于opencv实现图像数字识别(五)—投影法分割字符

    Java基于opencv实现图像数字识别(五)-投影法分割字符 水平投影法 1.水平投影法就是先用一个数组统计出图像每行黑色像素点的个数(二值化的图像): 2.选出一个最优的阀值,根据比这个阀值大或小 ...

  8. Java基于opencv实现图像数字识别(四)—图像降噪

    Java基于opencv实现图像数字识别(四)-图像降噪 我们每一步的工作都是基于前一步的,我们先把我们前面的几个函数封装成一个工具类,以后我们所有的函数都基于这个工具类 这个工具类呢,就一个成员变量 ...

  9. Java基于opencv实现图像数字识别(三)—灰度化和二值化

    Java基于opencv实现图像数字识别(三)-灰度化和二值化 一.灰度化 灰度化:在RGB模型中,如果R=G=B时,则彩色表示灰度颜色,其中R=G=B的值叫灰度值:因此,灰度图像每个像素点只需一个字 ...

  10. Java基于opencv实现图像数字识别(二)—基本流程

    Java基于opencv实现图像数字识别(二)-基本流程 做一个项目之前呢,我们应该有一个总体把握,或者是进度条:来一步步的督促着我们来完成这个项目,在我们正式开始前呢,我们先讨论下流程. 我做的主要 ...

随机推荐

  1. Intellij IDEA IDE中采用Maven集成SSM框架时配置文件的功能和关系说明

    Intellij IDEA IDE中采用Maven集成SSM框架时设计的配置文件主要有:pom.xml.web.xml.applicationContext.xml.springmvc-config. ...

  2. [转]使用navicat将excel文件导入mysql数据库

    excel: 注: 1.mysql里建立一张跟excel一样的表结构的表(包含id) 2.excel最好没有任何格式,只是纯值,不然会出现导入不了的错误 ----------------------- ...

  3. Ubuntu安装宝塔服务

    Linux面板7.9.4安装脚本 查看详细安装教程 使用 SSH 连接工具,如 堡塔SSH终端 连接到您的 Linux 服务器后, 挂载磁盘 ,根据系统执行相应命令开始安装(大约2分钟完成面板安装): ...

  4. BigTable-列族存储

    BigTable 其实就是 Google 设计的分布式结构化数据表. Bigtable 的设计动机: 需要存储的数据种类繁多,包括URL.网页内容.用户的个性化设置在内的数据都是Google需要经常处 ...

  5. Kotlin:【针对空安全管理的操作】安全调用操作符、使用带let的安全调用、非空断言操作符(感叹号操作符)、使用if判断null值情况、使用空合并操作符(类似三元表达式)

     具体使用:

  6. 深入探讨数据库索引类型:B-tree、Hash、GIN与GiST的对比与应用

    title: 深入探讨数据库索引类型:B-tree.Hash.GIN与GiST的对比与应用 date: 2025/1/26 updated: 2025/1/26 author: cmdragon ex ...

  7. uni-app如何只用插件市场中的插件

    将你需要的插件下载下来.比如说如下图 在pages.json配置 globalStyle是一个单独的字段 "globalStyle": { "usingComponent ...

  8. 效率起飞!天翼云并行文件服务HPFS高效应对AI时代大模型训练存储挑战!

    国内外AI大模型层出不穷,训练数据复杂程度更是呈指数级增加.如今,在万亿级参数时代,单个资源池已无法满足大模型训练场景中动辄PB级的数据存储量,对于企业来说,启用多个资源池构成的分布式存储势在必行. ...

  9. Q:ssh远程连接慢的原因排查

    连接linux服务器一般都是使用SSH远程连接的方式.有时,SSH连接速度很慢,大约30s左右,但是ping时一切正常. 问题原因 1.server的sshd会去DNS查找访问的client ip的h ...

  10. Q:批处理备份临时文件

    批处理:将本月临时文件移动到历史目录中 chcp 936 @echo off set month=%date:~2,2%%date:~5,2% set year=%date:~0,4% echo %y ...