ToB企服应用市场:ToB评测及商务社交产业平台

标题: Spring Boot 异步编程深入剖析 [打印本页]

作者: 惊落一身雪    时间: 昨天 12:21
标题: Spring Boot 异步编程深入剖析
Spring Boot 异步编程深入剖析

1. 异步方法的利用

原理深度解析

Spring Boot 的异步方法基于 Spring 的 AOP(面向切面编程)实现。当在方法上添加 @Async 注解时,Spring 会为该方法地点的类创建一个署理对象。当调用该异步方法时,实际上是调用署理对象的方法,署理对象会将该方法的执行委托给线程池中的一个线程去执行,而调用线程会继续执行后续代码,从而实现异步执行。
更复杂的利用场景

除了返回 CompletableFuture,还可以利用 ListenableFuture(在 Spring 4.0 之前)或无返回值的异步方法。
  1. import org.springframework.scheduling.annotation.Async;
  2. import org.springframework.stereotype.Service;
  3. import org.springframework.util.concurrent.ListenableFuture;
  4. import org.springframework.util.concurrent.SettableListenableFuture;
  5. import java.util.concurrent.CompletableFuture;
  6. @Service
  7. public class AsyncService {
  8.     // 无返回值的异步方法
  9.     @Async
  10.     public void asyncVoidMethod() {
  11.         try {
  12.             Thread.sleep(2000);
  13.             System.out.println("Async void method completed");
  14.         } catch (InterruptedException e) {
  15.             e.printStackTrace();
  16.         }
  17.     }
  18.     // 使用 ListenableFuture
  19.     @Async
  20.     public ListenableFuture<String> asyncListenableMethod() {
  21.         SettableListenableFuture<String> future = new SettableListenableFuture<>();
  22.         try {
  23.             Thread.sleep(2000);
  24.             future.set("Async listenable method completed");
  25.         } catch (InterruptedException e) {
  26.             future.setException(e);
  27.         }
  28.         return future;
  29.     }
  30. }
复制代码
踩坑记录


利专心得


2. 线程池设置

深入明白线程池参数


动态调整线程池参数

可以通过编写自定义的线程池管理器来动态调整线程池的参数。
  1. import org.springframework.context.annotation.Bean;
  2. import org.springframework.context.annotation.Configuration;
  3. import org.springframework.scheduling.annotation.AsyncConfigurer;
  4. import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
  5. import java.util.concurrent.Executor;
  6. @Configuration
  7. public class AsyncConfig implements AsyncConfigurer {
  8.     private ThreadPoolTaskExecutor executor;
  9.     @Override
  10.     @Bean(name = "asyncExecutor")
  11.     public Executor getAsyncExecutor() {
  12.         executor = new ThreadPoolTaskExecutor();
  13.         executor.setCorePoolSize(5);
  14.         executor.setMaxPoolSize(10);
  15.         executor.setQueueCapacity(25);
  16.         executor.setThreadNamePrefix("AsyncThread-");
  17.         executor.initialize();
  18.         return executor;
  19.     }
  20.     public void adjustCorePoolSize(int corePoolSize) {
  21.         executor.setCorePoolSize(corePoolSize);
  22.         executor.initialize();
  23.     }
  24. }
复制代码
踩坑记录


利专心得


3. 异步使命的监控与管理

高级监控方法

除了利用 CompletableFuture 来监控使命状态,还可以利用 Spring Boot Actuator 来监控线程池的状态。
  1. <dependency>
  2.     <groupId>org.springframework.boot</groupId>
  3.     <artifactId>spring-boot-starter-actuator</artifactId>
  4. </dependency>
复制代码
通过访问 /actuator/metrics 端点可以检察线程池的相干指标,如活泼线程数、使命完成数等。
使命链管理

可以利用 CompletableFuture 的 thenApply、thenAccept、thenCompose 等方法来构建使命链,实现复杂的异步使命管理。
  1. import org.springframework.beans.factory.annotation.Autowired;
  2. import org.springframework.web.bind.annotation.GetMapping;
  3. import org.springframework.web.bind.annotation.RestController;
  4. import java.util.concurrent.CompletableFuture;
  5. @RestController
  6. public class AsyncController {
  7.     @Autowired
  8.     private AsyncService asyncService;
  9.     @GetMapping("/asyncChain")
  10.     public String asyncChain() {
  11.         CompletableFuture<String> future1 = asyncService.asyncMethod();
  12.         CompletableFuture<String> future2 = future1.thenApply(result -> result + " -> Next step");
  13.         future2.thenAccept(finalResult -> System.out.println(finalResult));
  14.         return "Async chain started";
  15.     }
  16. }
复制代码
踩坑记录


利专心得


通过深入明白 Spring Boot 异步编程的原理和机制,合理设置线程池,以及有效地监控和管理异步使命,可以充分发挥异步编程的上风,提高应用步伐的性能和响应本领。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4