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

Spring ApplicationEventPublisher 异步处理与消息队列全面解析

1. ApplicationEventPublisher 同步与异步处理

1.1 默认同步行为

ApplicationEventPublisher 默认采用同步处理机制:

@Service
public class OrderService {@Autowiredprivate ApplicationEventPublisher publisher;@Transactionalpublic void createOrder() {System.out.println("开始发布订单创建事件...");// 同步发布事件 - 会阻塞直到所有监听器执行完成publisher.publishEvent(new OrderCreatedEvent("ORDER-123"));// 这行代码会等待所有监听器执行完后才会执行System.out.println("事件发布完成,继续主流程。");}
}@Component
public class OrderEventListener {@EventListenerpublic void handleOrderCreated(OrderCreatedEvent event) {// 模拟耗时操作 - 会阻塞主线程Thread.sleep(2000);System.out.println("监听器处理完毕");}
}

同步执行输出:

[http-nio-8080-exec-1] 开始发布订单创建事件...
[http-nio-8080-exec-1] 监听器处理完毕
[http-nio-8080-exec-1] 事件发布完成,继续主流程。
1.2 异步处理方案
方案一:使用 @Async 注解(推荐)
@SpringBootApplication
@EnableAsync  // 开启异步支持
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}@Component
public class OrderEventListener {@Async  // 标记为异步方法@EventListenerpublic void handleOrderCreated(OrderCreatedEvent event) {System.out.println("[" + Thread.currentThread().getName() + "] 异步处理事件");Thread.sleep(2000);System.out.println("异步处理完成");}
}

异步执行输出:

[http-nio-8080-exec-1] 开始发布订单创建事件...
[http-nio-8080-exec-1] 事件发布完成,继续主流程。
[task-1] 异步处理事件
[task-1] 异步处理完成
方案二:自定义线程池
@Configuration
public class AsyncConfig {@Bean("customEventExecutor")public Executor customEventExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(5);executor.setMaxPoolSize(10);executor.setQueueCapacity(100);executor.setThreadNamePrefix("custom-event-");executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());executor.initialize();return executor;}
}@Component
public class ManualAsyncEventPublisher {@Autowired@Qualifier("customEventExecutor")private Executor customEventExecutor;@Autowiredprivate ApplicationEventPublisher eventPublisher;public void publishEventAsync(Object event) {customEventExecutor.execute(() -> {eventPublisher.publishEvent(event);});}
}
方案三:全局异步配置
@Configuration
public
http://www.dtcms.com/a/487507.html

相关文章:

  • 站长网站被跳转怎么办WordPress怎么去掉主题也没
  • 自定义View —> 项目中遇到的复杂UI
  • 网站中信息更新怎么做的烟台建网站
  • IIS发版各接口慢排查
  • 【操作系统核心详解】段式存储与页式存储:区别、碎片及虚拟内存的本质
  • 网站导航图怎么做网站建设邀标比选
  • 杭州网站建设出名企业网站推广技巧有哪些
  • 优质中药饮片供应是什么?主要涵盖哪些关键质量标准?
  • 代码随想录第36天第37天 | 01背包应用 及 完全背包⭐
  • 【GUI自动化测试】Python logging 日志模块与 Allure 测试报告实战指南
  • 两阶段随机规划为电力市场注入智慧
  • 公路工程项目管理软件选型指南
  • 潍坊高端网站设计官网搭建平台
  • 电商网站 开发费用山东建设网站首页
  • JDK 8u5 Windows 64位安装教程(详解,含环境变量配置)​
  • 四川城市建设住建厅网站百度官网认证入口
  • 黑马商城day3-微服务01
  • Flutter---两种带输入框的对话框
  • 自己做的网站怎么在移动端访问网站引导插件
  • 做网站的核验单 是下载的吗网站开发和网络设计有什么区别
  • AR模型(自回归模型)
  • 分布式系统相关知识总结
  • 越南k线历史数据、IPO新股股票数据接口文档
  • JavaScript的书写位置和注释
  • 【Java零基础·第6章】面向对象(二):构造器、封装、对象数组
  • 网站 系统设置建筑工程包括哪些项目
  • 重庆专业网站推广报价怎么做刷会员的网站
  • QT-基础
  • 网页设计图片之间空隙北京seo如何排名
  • Feign接口传递复杂参数注解@ModelAttribute+@SpringQueryMap