数据库表设计

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. 16. C++快速入门--模板和Concept

    待修改 1 定义模板 1.1 模板形参 模板参数 模板可以有两种参数, 一种是类型参数, 一种是非类型参数 这两种参数可以同时存在, 非类型参数 的类型 可以是 模板类型形参 template < ...

  2. 21. C++快速入门--协程 Coroutine 入门

    参考: https://www.cnblogs.com/blizzard8204/p/17563217.html https://www.bennyhuo.com/2022/03/09/cpp-cor ...

  3. Solution Set - “潮汐守候终结放逐月圆”

    目录 0.「NOI Simu.」游戏 1.「NOI Simu.」海盗 2.「集训队作业 2020-2021」「LOJ #3405」Gem Island 2 3.「UR #12」「UOJ #181」密码 ...

  4. web应用分页-copy

    1. 场景描述 目前大部分的应用程序中都会用到分页功能,以便减少前端浏览器及后台服务器的压力,以及其他方面的考虑. (1)分页从概念上可分为逻辑分页和物理分页,逻辑分页主要是通过应用程序(前端或者后端 ...

  5. java线程池优化

    ThreadPoolExecutor机制 一.概述 1.ThreadPoolExecutor作为java.util.concurrent包对外提供基础实现,以内部线程池的形式对外提供管理任务执行,线程 ...

  6. Java集合容器面试题

    Java常用集合类有哪些?Collection接口的子接口包括:Set接口和List接口Map接口的实现类主要有:HashMap.TreeMap.Hashtable.ConcurrentHashMap ...

  7. SourceTree SSH第一次登录需要交互确认的问题

    问题 在SourceTree SSH配置完ssh之后向上提交代码的时候发现: The server's host key is not cached in the registry. You have ...

  8. GIS数据合集:作物、植被数据下载平台整理

      本文对目前主要的作物类型与产量.植被物候与指数数据产品的获取网站加以整理与介绍. 目录 4 植被农业数据 4.1 作物产量数据 4.1.1 SPAM 4.1.2 Aerial Intelligen ...

  9. 九. Redis 持久化-RDB(详细讲解说明,一个配置一个说明分析,步步讲解到位)

    九. Redis 持久化-RDB(详细讲解说明,一个配置一个说明分析,步步讲解到位) @ 目录 九. Redis 持久化-RDB(详细讲解说明,一个配置一个说明分析,步步讲解到位) 1. RDB 概述 ...

  10. 使用iceberg-使用Iceberg数据湖需要注意的点

    一.资料准备 1.mysql地址选择 因为阿里云只读节点binlog保留时间短,需要用读写集群地址.可以登录阿里云控制台查看地址是只读还是读写,不清楚的话可以找dba要读写地址. 二.Iceberg概 ...