• 【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 {
    
        @Bean
        fun coroutineScope(): CoroutineScope {
            return object : CoroutineScope {
                override val coroutineContext: CoroutineContext
                    get() = Dispatchers.Default
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    此时在其他地方都可以通过依赖注入的方式使用该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)           
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

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

    coroutineScope.launch {
            delay(10000) // 延迟10秒
            
      			//...           
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

  • 相关阅读:
    jenkins拉取git代码 code 128解决方案
    【Java基础面试十二】、说一说你对面向对象的理解
    「PAT甲级真题解析」Advanced Level 1009 Product of Polynomials
    软文推广效果怎么样?这篇揭晓答案
    不吃早餐对你有害吗?为你揭示惊人的真相
    SAP通过应用实例分析BOM组件中“Asm“勾选问题
    3.4 设置环境变量MAKEFILES
    【PTHREAD】线程状态
    Fast Adaptive Similarity Search through Variance-Aware Quantization (ICDE 2022)
    【单元测试】如何使用 JUnit5 框架?
  • 原文地址:https://blog.csdn.net/zx156955/article/details/136671657