当前位置: 首页 > news >正文

【kotlin】在SpringBoot项目中使用kotlin协程coroutine实现方法的异步延迟调用,例如延迟查询短信发送详情结果。

前言:

当前做法实现了对某个方法异步延迟的操作,常见的场景如短信发送日志的延迟查询和记录。
一般来说,短信的发送和接收,在短信云服务商那里形成完整记录是需要一定的时间的,只有这段时间过去才可以有效查到短信的发送详情。例如短信发送后的10秒我们主动去查询,也是可以的,但是这个查询也不能阻塞主线程,那我们就要使用异步的方式,常见的有三种方法可以实现该效果:

  • 编写一个回调接口,并将该接口配置为回调地址,等待短信服务商回调该接口接收数据并记录。
  • 使用MQ创建延迟队列,在延迟队列触发后去查询数据并记录。
  • 使用定时任务,定时批量查询数据并记录。

今天我来为大家介绍第四种方法,在Springboot项目中实现,这个做法更简便且代码简单,资源可控性高,利用kotlin的协程来完成这个功能。
协程的知识不在此处展开,感兴趣的同学点此学习官方文档。

实现方法

由于比较简单,直接上代码了,比较直观:

第一步:注入默认协程作用域到SpringIoc:
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import kotlin.coroutines.CoroutineContext@Configuration
class CoroutineScopeConfig {@Beanfun coroutineScope(): CoroutineScope {return object : CoroutineScope {override val coroutineContext: CoroutineContextget() = Dispatchers.Default}}
}

此时在其他地方都可以通过依赖注入的方式使用该CoroutineScope。这个CoroutineScope 是默认的全局作用域,此时注册这个bean到springioc后,它的生命周期就由spring来管理。

第二步:在默认协程作用域下使用协程:
@Component
class SmsSender(val coroutineScope: CoroutineScope) {fun sendSms(tempalteCode:String, mobile:String, params:Map<String,String?>) {//发送val request = RequestBuilder().setMobile(mobile).setTemplateCode(templateCode).setParams(params).build()val response = doSend(mobile,request)//启动一个协程,延迟10s后查询日志并记录coroutineScope.launch {delay(10000) // 延迟10秒//查询val reuslt = querySmsDetail(response.bizId)//保存       save(result)           }}
}

以上内容为伪代码,发送短信后,启动了一个协程,协程的任务是延迟10s后查询并保存短信发送详情。
核心代码为:

coroutineScope.launch {delay(10000) // 延迟10秒//...           }}

你看,异步延迟执行一个任务,就是这么简单。实际上协程还能实现很多的业务功能,后面有机会有用例了再讲讲其他的使用方式。

相关文章:

  • H5 宠物店官网源码
  • 1054:三角形判断
  • Docker常见指令
  • 重塑语言智能未来:掌握Transformer,驱动AI与NLP创新实战
  • 进线程学习--01
  • 【wine】WINEDEBUG 分析mame模拟器不能加载roms下面的游戏 可以调整参数,快速启动其中一个游戏kof98
  • MySQL:概念简章
  • 从顺序表到链表再到队列和栈
  • 知识碎片收集
  • 【Redis笔记】基于Redis的Stream结构作为消息队列,实现异步任务
  • 宏集案例 | 风电滑动轴承齿轮箱内多点温度采集与处理
  • 【前端】处理一次性十万条数据渲染方案(不考虑后端分页)
  • 【安卓与苹果区别】详细讲解
  • uniapp发行H5获取当前页面query
  • QT UI设计
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • 【技术性】Search知识
  • Android开源项目规范总结
  • ES6之路之模块详解
  • Mac转Windows的拯救指南
  • php面试题 汇集2
  • underscore源码剖析之整体架构
  • vue.js框架原理浅析
  • Yeoman_Bower_Grunt
  • 产品三维模型在线预览
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 第2章 网络文档
  • 计算机常识 - 收藏集 - 掘金
  • 如何优雅地使用 Sublime Text
  • 什么软件可以剪辑音乐?
  • 数组的操作
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • Java数据解析之JSON
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • 移动端高清、多屏适配方案
  • ​520就是要宠粉,你的心头书我买单
  • ​ubuntu下安装kvm虚拟机
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (6)STL算法之转换
  • (day6) 319. 灯泡开关
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (转)平衡树
  • (转)项目管理杂谈-我所期望的新人
  • .apk 成为历史!
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .net中应用SQL缓存(实例使用)
  • @property括号内属性讲解
  • @RestController注解的使用
  • [AIGC] SQL中的数据添加和操作:数据类型介绍