重学SpringBoot3-异步编程完全指南

打印 上一主题 下一主题

主题 1772|帖子 1772|积分 5316

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
更多SpringBoot3内容请关注我的专栏:《SpringBoot3》
等候您的点赞??收藏评论
  重学SpringBoot3-异步编程完全指南



  • 1. 简介
  • 2. @Async注解


    • 2.1 基础配置
    • 2.2 基本使用
    • 2.3 自界说线程池

  • 3. WebFlux响应式编程


    • 3.1 依靠配置
    • 3.2 响应式Controller示例
    • 3.3 响应式Service实现

  • 4. CompletableFuture的使用


    • 4.1 基本操纵
    • 4.2 组合操纵

  • 5. 变乱驱动模型


    • 5.1 自界说变乱
    • 5.2 变乱监听器

  • 6. 消息队列(MQ)异步处置惩罚


    • 6.1 RabbitMQ配置
    • 6.2 消息队列配置类
    • 6.3 消息生产者
    • 6.4 消息消耗者
    • 6.5 消息确认机制

  • 7. 最佳实践


    • 7.1 异常处置惩罚
    • 7.2 线程池配置
    • 7.3 性能优化
    • 7.4 消息队列使用建议

  • 8. 总结
  • 参考资料
1. 简介

在现代应用步伐开发中,异步编程已经成为提升应用性能和用户体验的紧张手段。SpringBoot 3提供了多种异步编程的方式,本文将详细介绍这些实现方式及其最佳实践。
2. @Async注解

2.1 基础配置

起首须要在启动类或配置类上启用异步支持:
  1. @EnableAsync
  2. @SpringBootApplication
  3. public class Application {
  4.     public static void main(String[] args) {
  5.         SpringApplication.run(Application.class, args);
  6.     }
  7. }
复制代码
2.2 基本使用

  1. @Service
  2. public class EmailService {
  3.     @Async
  4.     public CompletableFuture<String> sendEmail(String to) {
  5.         // 模拟发送邮件耗时
  6.         try {
  7.             Thread.sleep(2000);
  8.         } catch (InterruptedException e) {
  9.             Thread.currentThread().interrupt();
  10.         }
  11.         return CompletableFuture.completedFuture("邮件发送成功:" + to);
  12.     }
  13. }
复制代码
2.3 自界说线程池

  1. @Configuration
  2. public class AsyncConfig implements AsyncConfigurer {
  3.    
  4.     @Override
  5.     public Executor getAsyncExecutor() {
  6.         ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
  7.         executor.setCorePoolSize(5);
  8.         executor.setMaxPoolSize(10);
  9.         executor.setQueueCapacity(25);
  10.         executor.setThreadNamePrefix("AsyncThread-");
  11.         executor.initialize();
  12.         return executor;
  13.     }
  14.    
  15.     @Override
  16.     public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
  17.         return new SimpleAsyncUncaughtExceptionHandler();
  18.     }
  19. }
复制代码
3. WebFlux响应式编程

3.1 依靠配置

  1. <dependency>
  2.     <groupId>org.springframework.boot</groupId>
  3.     <artifactId>spring-boot-starter-webflux</artifactId>
  4. </dependency>
复制代码
3.2 响应式Controller示例

  1. @RestController
  2. @RequestMapping("/api")
  3. public class UserController {
  4.    
  5.     @Autowired
  6.     private UserService userService;
  7.    
  8.     @GetMapping("/users")
  9.     public Flux<User> getAllUsers() {
  10.         return userService.findAllUsers();
  11.     }
  12.    
  13.     @GetMapping("/users/{id}")
  14.     public Mono<User> getUser(@PathVariable String id) {
  15.         return userService.findById(id);
  16.     }
  17. }
复制代码
3.3 响应式Service实现

  1. @Service
  2. public class UserService {
  3.    
  4.     public Flux<User> findAllUsers() {
  5.         return Flux.fromIterable(users)
  6.                    .delayElements(Duration.ofMillis(100));
  7.     }
  8.    
  9.     public Mono<User> findById(String id) {
  10.         return Mono.justOrEmpty(findUserById(id))
  11.                    .delayElement(Duration.ofMillis(100));
  12.     }
  13. }
复制代码
4. CompletableFuture的使用

4.1 基本操纵

  1. @Service
  2. public class OrderService {
  3.    
  4.     public CompletableFuture<Order> processOrder(Order order) {
  5.         return CompletableFuture.supplyAsync(() -> {
  6.             // 处理订单逻辑
  7.             return order;
  8.         });
  9.     }
  10.    
  11.     public CompletableFuture<Order> validateOrder(Order order) {
  12.         return CompletableFuture.supplyAsync(() -> {
  13.             // 验证订单逻辑
  14.             return order;
  15.         });
  16.     }
  17. }
复制代码
4.2 组合操纵

  1. public CompletableFuture<Order> createOrder(Order order) {
  2.     return validateOrder(order)
  3.             .thenCompose(this::processOrder)
  4.             .thenApply(processedOrder -> {
  5.                 // 更新订单状态
  6.                 return processedOrder;
  7.             })
  8.             .exceptionally(ex -> {
  9.                 // 异常处理
  10.                 log.error("订单处理失败", ex);
  11.                 return null;
  12.             });
  13. }
复制代码
5. 变乱驱动模型

5.1 自界说变乱

  1. public class OrderCreatedEvent extends ApplicationEvent {
  2.     private final Order order;
  3.    
  4.     public OrderCreatedEvent(Object source, Order order) {
  5.         super(source);
  6.         this.order = order;
  7.     }
  8.    
  9.     public Order getOrder() {
  10.         return order;
  11.     }
  12. }
复制代码
5.2 变乱监听器

  1. @Component
  2. public class OrderEventListener {
  3.    
  4.     @Async
  5.     @EventListener
  6.     public void handleOrderCreatedEvent(OrderCreatedEvent event) {
  7.         Order order = event.getOrder();
  8.         // 异步处理订单逻辑
  9.     }
  10. }
复制代码
6. 消息队列(MQ)异步处置惩罚

6.1 RabbitMQ配置

  1. <dependency>
  2.     <groupId>org.springframework.boot</groupId>
  3.     <artifactId>spring-boot-starter-amqp</artifactId>
  4. </dependency>
  5. spring:
  6.   rabbitmq:
  7.     host: localhost
  8.     port: 5672
  9.     username: guest
  10.     password: guest
复制代码
6.2 消息队列配置类

  1. @Configuration
  2. public class RabbitMQConfig {
  3.    
  4.     @Bean
  5.     public Queue orderQueue() {
  6.         return new Queue("order.queue", true);
  7.     }
  8.    
  9.     @Bean
  10.     public DirectExchange orderExchange() {
  11.         return new DirectExchange("order.exchange");
  12.     }
  13.    
  14.     @Bean
  15.     public Binding orderBinding(Queue orderQueue, DirectExchange orderExchange) {
  16.         return BindingBuilder.bind(orderQueue)
  17.                 .to(orderExchange)
  18.                 .with("order.routing.key");
  19.     }
  20. }
复制代码
6.3 消息生产者

  1. @Service
  2. @Slf4j
  3. public class OrderProducer {
  4.    
  5.     @Autowired
  6.     private RabbitTemplate rabbitTemplate;
  7.    
  8.     public void sendOrder(Order order) {
  9.         try {
  10.             rabbitTemplate.convertAndSend("order.exchange", "order.routing.key", order);
  11.             log.info("订单消息发送成功: {}", order.getId());
  12.         } catch (Exception e) {
  13.             log.error("订单消息发送失败", e);
  14.         }
  15.     }
  16. }
复制代码
6.4 消息消耗者

  1. @Component
  2. @Slf4j
  3. public class OrderConsumer {
  4.    
  5.     @RabbitListener(queues = "order.queue")
  6.     public void processOrder(Order order) {
  7.         try {
  8.             log.info("收到订单消息: {}", order.getId());
  9.             // 异步处理订单逻辑
  10.             processOrderAsync(order);
  11.         } catch (Exception e) {
  12.             log.error("订单处理失败", e);
  13.         }
  14.     }
  15.    
  16.     private void processOrderAsync(Order order) {
  17.         // 具体的订单处理逻辑
  18.     }
  19. }
复制代码
6.5 消息确认机制

  1. @Configuration
  2. public class RabbitMQConfirmConfig {
  3.    
  4.     @Bean
  5.     public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
  6.         RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
  7.         
  8.         // 消息发送到交换机确认
  9.         rabbitTemplate.setConfirmCallback((correlationData, ack, cause) -> {
  10.             if (!ack) {
  11.                 log.error("消息发送到交换机失败: {}", cause);
  12.             }
  13.         });
  14.         
  15.         // 消息从交换机路由到队列确认
  16.         rabbitTemplate.setReturnsCallback(returned -> {
  17.             log.error("消息从交换机路由到队列失败: {}", returned);
  18.         });
  19.         
  20.         return rabbitTemplate;
  21.     }
  22. }
复制代码
7. 最佳实践

7.1 异常处置惩罚



  • 使用@Async时要注意异常处置惩罚
  • 为异步方法返回Future或CompletableFuture以便跟踪执行状态
  • 实现AsyncUncaughtExceptionHandler处置惩罚未捕获的异常
  • MQ消耗者要做好消息重试和死信队列处置惩罚
7.2 线程池配置



  • 根据业务需求合理配置线程池参数
  • 为不同业务场景配置不同的线程池
  • 监控线程池状态,克制资源耗尽
7.3 性能优化



  • 合理使用响应式编程,克制过度使用
  • 注意内存泄漏问题
  • 实现优雅停机机制
  • MQ消息要控制巨细,克制消息堆积
7.4 消息队列使用建议



  • 选择符合的消息投递模式(同步/异步)
  • 实现消息幂等性处置惩罚
  • 合理设置消息逾期时间
  • 监控消息积蓄情况
  • 实现消息追踪机制
8. 总结

SpringBoot 3提供了丰富的异步编程支持,从简单的@Async注解到响应式编程,再到变乱驱动模型和消息队列,开发者可以根据详细需求选择符合的方案。在实际应用中,须要注意异常处置惩罚、资源管理和性能优化等方面的问题。
消息队列作为一种紧张的异步处置惩罚方式,特别适合处置惩罚耗时操纵、削峰填谷以及系统解耦。在使用时须要注意消息的可靠性投递、幂等性处置惩罚以及性能监控等方面的问题。
参考资料


  • Spring官方文档
  • Spring WebFlux文档
  • Java CompletableFuture API文档
  • Spring AMQP文档
  • RabbitMQ官方文档

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

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

天津储鑫盛钢材现货供应商

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表