当前位置:   article > 正文

SpringBoot + kotlin 协程小记

SpringBoot + kotlin 协程小记

前言:

Kotlin 协程是基于 Coroutine 实现的,其设计目的是简化异步编程。协程提供了一种方式,可以在一个线程上写起来像是在多个线程中执行。

协程的基本概念:

  • 协程是轻量级的,不会创建新的线程。

  • 协程会挂起当前的协程,而不会阻塞线程。

  • 协程可以在suspend函数中暂停执行,并在暂停点恢复执行。

一、引包

${kotlin.version} : <kotlin.version>1.8.21</kotlin.version>

注意:org.jetbrains.kotlinx 最新在1.6.0

  1. <dependency>
  2. <groupId>org.jetbrains.kotlin</groupId>
  3. <artifactId>kotlin-stdlib-jdk8</artifactId>
  4. <version>${kotlin.version}</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.jetbrains.kotlin</groupId>
  8. <artifactId>kotlin-reflect</artifactId>
  9. <version>${kotlin.version}</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.jetbrains.kotlinx</groupId>
  13. <artifactId>kotlinx-coroutines-core</artifactId>
  14. <version>1.6.0</version>
  15. </dependency>
  16. <dependency>
  17. <groupId>org.jetbrains.kotlin</groupId>
  18. <artifactId>kotlin-test</artifactId>
  19. <version>${kotlin.version}</version>
  20. <scope>test</scope>
  21. </dependency>

二、 interface 定义

  1. import com.baomidou.mybatisplus.extension.service.IService
  2. import com.zc.bean.PriceBean
  3. import org.springframework.stereotype.Repository
  4. @Repository
  5. interface TestKotlinService : IService<PriceBean> {
  6. //suspend 协程方法的定义
  7. suspend fun test(): String
  8. fun te()
  9. }

三、Ipml 实现

  1. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
  2. import com.zc.bean.PriceBean
  3. import com.zc.mapper.TestKotlinMapper
  4. import kotlinx.coroutines.Dispatchers
  5. import kotlinx.coroutines.delay
  6. import kotlinx.coroutines.withContext
  7. import lombok.extern.slf4j.Slf4j
  8. import org.springframework.stereotype.Service
  9. /**
  10. * @author zc
  11. * @date 2024/4/18 9:56
  12. * @desc
  13. */
  14. @Service
  15. @Slf4j
  16. open class TestKotlinServcieImpl : ServiceImpl<TestKotlinMapper, PriceBean>(), TestKotlinService{
  17. //withContext 切换到指定的线程(IO线程)
  18. override suspend fun test() = withContext(Dispatchers.IO){
  19. delay(10000)
  20. println("suspend")
  21. return@withContext "success"
  22. }
  23. override fun te(){
  24. println("test")
  25. }
  26. }

四、controller 

  1. /**
  2. * @author zc
  3. * @date 2024/4/18 10:38
  4. * @desc
  5. */
  6. @RestController
  7. @RequestMapping("/price")
  8. @Tag(name = "kotlin")
  9. class TestKotlinController {
  10. @Autowired
  11. private lateinit var testKotlinService: TestKotlinService;
  12. @GetMapping("test")
  13. fun testScope(){
  14. println("start")
  15. testKotlinService.te()
  16. //创建协程,并在io线程上执行
  17. val coroutineScope = CoroutineScope(Dispatchers.IO)
  18. coroutineScope.launch {
  19. //async/await获取返回值
  20. // val result = async { testKotlinService.test() }.await()
  21. val result =
  22. withContext(Dispatchers.IO) { testKotlinService.test() }
  23. println("result: $result")
  24. }
  25. println("end")
  26. }
  27. }

五、测试

调用swagger 接口测试,在等待10秒后打印出suspend result: success,异步调用成功

六、学习文档:

文档 · Kotlin 官方文档 中文版

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/510854
推荐阅读
相关标签
  

闽ICP备14008679号