延时任务通知服务的设计及实现(四)-- webhook执行任务

一、本文内容

本文将简单梳理下,延迟任务通知服务的webhook模块实现。

这里的回调接口,请求方式约定为post,参数通过body传递参数。

实现比较简单,先梳理其流程图,再是简单的代码实现。

二、流程图

在这里插入图片描述

三、异步执行任务

对线程池进行自定义其配置。


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.task.AsyncTaskExecutor;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import java.util.concurrent.ThreadPoolExecutor;/*** Async注解的配置.** @author xxx*/
@Configuration
@EnableAsync
public class AsyncConfig {@Bean(name = "taskExecutor")public AsyncTaskExecutor taskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();// 核心线程数executor.setCorePoolSize(10);// 最大线程数executor.setMaxPoolSize(50);// 队列容量executor.setQueueCapacity(2000);// 线程名称前缀executor.setThreadNamePrefix("DelayTask-");// 其他配置executor.setKeepAliveSeconds(60);executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());executor.initialize();return executor;}
}

四、任务通知的代码实现

@Async("taskExecutor")public void handleTask(String transNo, Date notifyDate) {// 分布式锁if (!stringRedisTemplate.opsForValue().setIfAbsent(String.format(LOCK_KEY_TASK_EXECUTE, transNo),"1", 10, TimeUnit.SECONDS)) {log.warn("任务正在执行中, transNo={},notifyDate={}", transNo, notifyDate);return;}// 任务执行前,判断任务的状态NotifyTask notifyTask = this.getNotifyTask(transNo);if (null == notifyTask) {log.warn("任务不存在, transNo={},notifyDate={}", transNo, notifyDate);return;}if (notifyTask.getIsFinished()) {log.warn("任务已执行, transNo={},notifyUrl={},notifyParams={},notifyDate={}",transNo, notifyTask.getNotifyUrl(), notifyTask.getNotifyParams(), notifyDate);return;}// 判断任务的执行时间是否与期望执行时间一致if (null != notifyDate && !DateUtil.isSameTime(notifyDate, notifyTask.getNotifyDate())) {log.warn("任务的执行时间与期望执行时间不一致, transNo={},notifyUrl={},notifyParams={},notifyDate={},expectDate={}",transNo, notifyTask.getNotifyUrl(), notifyTask.getNotifyParams(), notifyDate, notifyTask.getNotifyDate());return;}boolean success = this.callback(notifyTask.getNotifyUrl(), notifyTask.getNotifyParams());if (!success) {// 判断任务是否支持重试if (notifyTask.getIsRetry() && notifyTask.getRetryTimes() < commonConfig.getMaxRetryTimes()) {notifyTask.retry();this.saveOrUpdateNotifyTask(notifyTask);} else {this.removeTaskFromRedis(transNo);}} else {// 更新任务的状态及完成时间notifyTask.finish();this.saveOrUpdateNotifyTask(notifyTask);}}private boolean callback(String notifyUrl, String notifyParams) {if (log.isInfoEnabled()) {log.info("回调接口, notifyUrl={}, notifyParams={}", notifyUrl, notifyParams);}HttpResponse httpResponse = HttpUtil.createPost(notifyUrl).body(notifyParams).setConnectionTimeout(3000).setReadTimeout(5000).execute();return httpResponse.isOk();}

五、总结

webhook模块,它跟使用什么延迟队列无关,主要步骤包括:

  • 对任务的交易流水号进行加分布式锁,防止不同节点的重复回调。(虽然我们要求业务方的回调接口是要满足幂等性的)
  • 判断任务是否存在,任务是否已完成
  • 任务可能修改了回调时间,作为任务的版本,当延迟队列中的任务和最新的版本不一样时,给与拒绝回调。
  • 回调失败,如果支持重试,则更新任务的回调时间;反之删除任务,不再执行。
  • 回调成功,更新任务的执行状态和完成时间。

附:相关系列文章链接

延时任务通知服务的设计及实现(一)-- 设计方案

延时任务通知服务的设计及实现(二)-- redisson的延迟队列RDelayedQueue

延时任务通知服务的设计及实现(三)-- JDK的延迟队列DelayQueue

延时任务通知服务的设计及实现(四)-- webhook执行任务

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

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

相关文章

【项目构建】04:动态库与静态库制作

OVERVIEW 1.编译动态链接库&#xff08;1&#xff09;编译动态库&#xff08;2&#xff09;链接动态库&#xff08;3&#xff09;运行时使用动态库 2.编译静态链接库&#xff08;1&#xff09;编译静态库&#xff08;2&#xff09;链接静态库&#xff08;3&#xff09;运行时使…

【链表——数据结构】

文章目录 1.单链表1.定义2.基本操作2.1.不带头结点2.2后插2.3前插2.4删除2.5按位查找2.6按值查找2.7求单链表长度2.8 建表 2.双链表1.初始化2.插入(后插)3.删除(后删)4.遍历 3.循环链表1.循环单链表2.循环双链表3.代码问题 4.静态链表1.简述基本操作的实现1.初始化3.删除某个结…

学习Rust的第21天:mini_grep第1部分

在本文中&#xff0c;我们开始用 Rust 构建一个类似 grep 的程序。我们涵盖了读取命令行参数、读取文件内容&#xff0c;并开始通过将程序构造为函数和结构体来重构程序。 Introduction 介绍 Running the following command will create a new project 运行以下命令将创建一个新…

应急学院物联网应急安全产教融合基地解决方案

第一章 背景 1.1物联网应急安全产教融合发展概况 物联网应急安全产教融合发展是当前社会发展的重要趋势。随着物联网技术的广泛应用&#xff0c;应急安全领域对人才的需求日益迫切。因此&#xff0c;产教融合成为培养高素质、专业化人才的关键途径。在这一背景下&#xff0c;…

02.Kafka部署安装

1 Linux 安装 Kafka 1.1 安装前的环境准备 由于 Kafka 是用 Scala 语言开发的&#xff0c;运行在 JVM 上&#xff0c;因此在安装Kafka之前需要先安装JDK。 yum install java-1.8.0-openjdk* -y kafka 依赖 zookeeper&#xff0c;所以需要先安装 zookeeper。 wget https://ar…

vue3——(模板应用,组件)

模板应用 Vue3 的模板应用和之前的版本基本一致&#xff0c;但是在一些关键点上有所不同。 Composition API Vue3 引入了 Composition API&#xff0c;这是一种全新的 API 设计风格&#xff0c;可以更好地组织代码&#xff0c;提高代码的复用性和可读性。与之前的 Options AP…

golang netpoller揭秘

golang netpoller是网络IO模型的核心部分&#xff0c;利用了操作系统提供的事件通知机制&#xff0c;如Linux的epoll、BSD的kqueue或者windows的IOCP。这些机制允许应用程序监视多个文件描述符&#xff08;在网络编程中&#xff0c;通常是 socket&#xff09;&#xff0c;并在其…

LLM优化:开源星火13B显卡及内存占用优化

1. 背景 本qiang~这两天接了一个任务&#xff0c;部署几个开源的模型&#xff0c;并且将本地经过全量微调的模型与开源模型做一个效果对比。 部署的开源模型包括&#xff1a;星火13B&#xff0c;Baichuan2-13B, ChatGLM6B等 其他两个模型基于transformers架构封装&#xff0…

【Linux】Centos7安装部署asterisk,搭建 SIP服务器

1、安装环境依赖 yum install -y make gcc zlib-devel perl wget yum install -y gcc gcc-c autoconf libtool automake make yum install -y openssl-devel &#xff08;以上需要联网安装&#xff0c;离线安装各种依赖需要进一步研究&#xff09; openssl version Open…

表单提交出现问题却没有报错

最近搞毕设提交表单传给后台总是出现错误&#xff0c;有时候可以运行成功&#xff0c;有时候运行不了但是没有报错&#xff0c;以为是jQuery导入的问题尝试换了jQuery的其他导入方式没有解决&#xff0c;后来发现前端页面的表单要防止默认操作&#xff01;&#xff01;&#xf…

CMUS狮身人面像(六)-调整语音识别准确性

调整语音识别准确性 精度差的原因测试数据库设置运行测试 语音识别的准确性并不总是很高。 首先&#xff0c;重要的是要了解您的准确性是否只是低于预期&#xff0c;还是总体上非常低。如果总体精度非常低&#xff0c;则您很可能错误配置了解码器。如果低于预期&#xff0c;可…

qt学习篇---C++基础学习

本学习笔记学习下面视频总结&#xff0c;感兴趣可以去学习。讲的很详细 【北京迅为】嵌入式学习之QT学习篇_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1tp4y1i7EJ/?spm_id_from333.337.search-card.all.click&vd_source8827cc0da16223b9f2ad8ae7111de9e2 目录 C…

【K8s】工作以来遇到的K8s相关问题、故障

工作以来遇到的有关K8S相关问题及故障 deployments 资源 2副本情况下&#xff0c;一个springboot的pod能访问&#xff0c;一个不能&#xff08;端口不通&#xff09;在K8S运维(多人管理) 不知道谁在链路加了个跨域配置&#xff0c;导致前端打不开图片某些安全部门演练时经常在…

Linux深入理解内核 - 内存寻址

目录 引论&#xff0c;三个地址 硬件中的分段 段描述符 快速访问段描述符 分段单元 Linux GDT Linux LDT 硬件中的分页 PAE 硬件高速缓存 TLB Linux中的分页 页表类型定义pgd_t、pmd_t、pud_t和pte_t pteval_t&#xff0c;pmdval_t&#xff0c;pudval_t&#xff0…

k8s pod 镜像拉取策略

在 Kubernetes (k8s) 中&#xff0c;Pod 容器镜像的拉取策略通过 imagePullPolicy 属性来控制。这一策略决定了 kubelet 如何以及何时从容器镜像仓库中拉取镜像。以下是三种主要的镜像拉取策略及其详细说明&#xff1a; Always: 说明: 这是默认的拉取策略。当设置为 Always 时&…

PDCA循环:持续精进的工具

文章目录 一、什么是PDCA二、PDCA的应用场景三、PDCA在信息系统项目管理中的应用 一、什么是PDCA PDCA循环是由美国质量管理专家沃特阿曼德休哈特&#xff08;Walter A. Shewhart&#xff09;在20世纪30年代提出的&#xff0c;最初用于制造业的质量管理。休哈特博士在构想PDCA…

【C++题解】1418. 求一个5位数的各个位之和

问题&#xff1a;1418. 求一个5位数的各个位之和 类型&#xff1a;基本运算、拆位求解 题目描述&#xff1a; 从键盘读入一个 5 位的正整数&#xff0c;请求出这个 5 位数的各个位之和。 输入&#xff1a; 一个 5 位的正整数 n 。 输出&#xff1a; 这个 5 位数的各个位之…

2385. 感染二叉树需要的总时间

2385. 感染二叉树需要的总时间 题目链接&#xff1a;2385. 感染二叉树需要的总时间 代码如下&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr)…

Aiseesoft Blu-ray Player for Mac:蓝光播放器

Aiseesoft Blu-ray Player for Mac是一款功能强大且易于使用的蓝光播放器&#xff0c;专为Mac用户打造。它以其卓越的性能和简洁的操作界面&#xff0c;为用户带来了全新的高清蓝光播放体验。 Aiseesoft Blu-ray Player for Mac v6.6.50激活版下载 这款软件支持播放任何高质量的…

ArcGIS Pro3.0软件破解版安装教程

软件名称&#xff1a;ArcGIS Pro 3.0 安装环境&#xff1a;Windows 软件大小&#xff1a;7.3GB 硬件要求&#xff1a;CPU2GHz&#xff0c;内存4G(或更高) 百度云下载链接 &#xff1a; https://pan.baidu.com/s/1CXy1MSwdQXdVnJoV2X422A 提 取 码 &#xff1a;r0w1 教学内…