电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

SpringBoot實現異步事件驅動的方法

瀏覽:96日期:2023-03-01 08:04:44
目錄Spring事件驅動源碼實戰

在項目實際開發過程中,我們有很多這樣的業務場景:一個事務中處理完一個業務邏輯后需要跟著處理另外一個業務邏輯,偽碼大致如下:

@Servicepublic class ProductServiceImpl { ... public void saveProduct(Product product) {productMapper.saveOrder(product);notifyService.notify(product); } ...}

很簡單并且很常見的一段業務邏輯:首先將產品先保存數據庫,然后發送通知。

某一天你們可能需要把新增的產品存到Es中,這時候也需要代碼可能變成這樣:

@Servicepublic class ProductServiceImpl { ... public void saveProduct(Product product) {productMapper.saveProduct(product);esService.saveProduct(product)notifyService.notify(product); } ...}

隨著業務需求的變化,代碼也需要跟著一遍遍的修改。而且還會存在另外一個問題,如果通知系統掛了,那就不能再新增產品了。

對于上面這種情況非常適合引入消息中間件(消息隊列)來對業務進行解耦,但并非所有的業務系統都會引入消息中間件(引入會第三方架構組件會帶來很大的運維成本)。

Spring提供了事件驅動機制可以幫助我們實現這一需求。

Spring事件驅動

spring事件驅動由3個部分組成

ApplicationEvent:表示事件本身,自定義事件需要繼承該類,用來定義事件 ApplicationEventPublisher:事件發送器,主要用來發布事件 ApplicationListener:事件監聽器接口,監聽類實現ApplicationListener 里onApplicationEvent方法即可,也可以在方法上增加@EventListener以實現事件監聽。

實現Spring事件驅動一般只需要三步:

自定義需要發布的事件類,需要繼承ApplicationEvent類 使用ApplicationEventPublisher來發布自定義事件 使用@EventListener來監聽事件

這里需要特別注意一點,默認情況下事件是同步的。即事件被publish后會等待Listener的處理。如果發布事件處的業務存在事務,監聽器處理也會在相同的事務中。如果需要異步處理事件,可以onApplicationEvent方法上加@Aync支持異步或在有@EventListener的注解方法上加上@Aync。

源碼實戰

創建事件

public class ProductEvent extends ApplicationEvent { public ProductEvent(Product product) {super(product); }}

發布事件

@Servicepublic class ProductServiceImpl implements IproductService { ... @Autowired private ApplicationEventPublisher publisher; @Override @Transactional(rollbackFor = Exception.class) public void saveProduct(Product product) { productMapper.saveProduct(product); //事件發布publisher.publishEvent(product); } ...}

事件監聽

@Slf4j@AllArgsConstructorpublic class ProductListener { private final NotifyService notifyServcie; @Async @Order @EventListener(ProductEvent.class) public void notify(ProductEvent event) { Product product = (Product) event.getSource(); notifyServcie.notify(product, 'product'); }}

在SpringBoot啟動類上增加@EnableAsync 注解

@Slf4j@EnableSwagger2@SpringBootApplication@EnableAsyncpublic class ApplicationBootstrap {...}

使用了Async后會使用默認的線程池SimpleAsyncTaskExecutor,一般我們會在項目中自定義一個線程池。

@Configurationpublic class ExecutorConfig { /** 核心線程數 */ private int corePoolSize = 10; /** 最大線程數 */ private int maxPoolSize = 50; /** 隊列大小 */ private int queueCapacity = 10; /** 線程最大空閑時間 */ private int keepAliveSeconds = 150; @Bean('customExecutor') public Executor myExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(corePoolSize);executor.setMaxPoolSize(maxPoolSize);executor.setQueueCapacity(queueCapacity);executor.setThreadNamePrefix('customExecutor-');executor.setKeepAliveSeconds(keepAliveSeconds);// rejection-policy:當pool已經達到max size的時候,如何處理新任務// CALLER_RUNS:不在新線程中執行任務,而是由調用者所在的線程來執行executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());executor.initialize();return executor; }}

到此這篇關于SpringBoot實現異步事件驅動的方法的文章就介紹到這了,更多相關SpringBoot 異步事件驅動內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
主站蜘蛛池模板: 皮带机_移动皮带机_大倾角皮带机_皮带机厂家 - 新乡市国盛机械设备有限公司 | 机床导轨_导轨板_滚轮导轨-上海旻佑精密机械有限公司 | 聚合氯化铝-碱式氯化铝-聚合硫酸铁-聚氯化铝铁生产厂家多少钱一吨-聚丙烯酰胺价格_河南浩博净水材料有限公司 | 杭州厂房降温,车间降温设备,车间通风降温,厂房降温方案,杭州嘉友实业爽风品牌 | 美名宝起名网-在线宝宝、公司、起名平台 | 淘趣英语网 - 在线英语学习,零基础英语学习网站 | 筒瓦厂家-仿古瓦-寺庙-古建琉璃瓦-宜兴市古典园林建筑陶瓷厂有限公司 | 高铝轻质保温砖_刚玉莫来石砖厂家_轻质耐火砖价格 | 飞扬动力官网-广告公司管理软件,广告公司管理系统,喷绘写真条幅制作管理软件,广告公司ERP系统 | 超声波成孔成槽质量检测仪-压浆机-桥梁预应力智能张拉设备-上海硕冠检测设备有限公司 | 焊接减速机箱体,减速机箱体加工-淄博博山泽坤机械厂 | 间苯二酚,间苯二酚厂家-淄博双和化工 | app开发|app开发公司|小程序开发|物联网开发||北京网站制作|--前潮网络 | 带式压滤机_污泥压滤机_污泥脱水机_带式过滤机_带式压滤机厂家-河南恒磊环保设备有限公司 | 手表腕表维修保养鉴定售后服务中心网点 - 名表维修保养 | 防火门|抗爆门|超大门|医疗门|隔声门-上海加汇门业生产厂家 | 长江船运_国内海运_内贸船运_大件海运|运输_船舶运输价格_钢材船运_内河运输_风电甲板船_游艇运输_航运货代电话_上海交航船运 | 磁力去毛刺机_去毛刺磁力抛光机_磁力光饰机_磁力滚抛机_精密金属零件去毛刺机厂家-冠古科技 | 数显水浴恒温振荡器-分液漏斗萃取振荡器-常州市凯航仪器有限公司 | 阿米巴企业经营-阿米巴咨询管理-阿米巴企业培训-广东键锋企业管理咨询有限公司 | 马尔表面粗糙度仪-MAHR-T500Hommel-Mitutoyo粗糙度仪-笃挚仪器 | 12cr1mov无缝钢管切割-15crmog无缝钢管切割-40cr无缝钢管切割-42crmo无缝钢管切割-Q345B无缝钢管切割-45#无缝钢管切割 - 聊城宽达钢管有限公司 | 磁力加热搅拌器-多工位|大功率|数显恒温磁力搅拌器-司乐仪器官网 | 破碎机锤头_耐磨锤头_合金锤头-鼎成机械一站式耐磨铸件定制服务 微型驱动系统解决方案-深圳市兆威机电股份有限公司 | 智慧旅游_智慧景区_微景通-智慧旅游景区解决方案提供商 | 东莞韩创-专业绝缘骨架|马达塑胶零件|塑胶电机配件|塑封电机骨架厂家 | 理化生实验室设备,吊装实验室设备,顶装实验室设备,实验室成套设备厂家,校园功能室设备,智慧书法教室方案 - 东莞市惠森教学设备有限公司 | 挤出熔体泵_高温熔体泵_熔体出料泵_郑州海科熔体泵有限公司 | 水平筛厂家-三轴椭圆水平振动筛-泥沙震动筛设备_山东奥凯诺矿机 包装设计公司,产品包装设计|包装制作,包装盒定制厂家-汇包装【官方网站】 | 茅茅虫AI论文写作助手-免费AIGC论文查重_写毕业论文降重 | 回收二手冲床_金丰旧冲床回收_协易冲床回收 - 大鑫机械设备 | 甲级防雷检测仪-乙级防雷检测仪厂家-上海胜绪电气有限公司 | 重庆轻质隔墙板-重庆安吉升科技有限公司| 强效碱性清洗剂-实验室中性清洗剂-食品级高纯氮气发生器-上海润榕科学器材有限公司 | 二次元影像仪|二次元测量仪|拉力机|全自动影像测量仪厂家_苏州牧象仪器 | 油缸定制-液压油缸厂家-无锡大鸿液压气动成套有限公司 | 塑料造粒机「厂家直销」-莱州鑫瑞迪机械有限公司 | TPE_TPE热塑性弹性体_TPE原料价格_TPE材料厂家-惠州市中塑王塑胶制品公司- 中塑王塑胶制品有限公司 | 菲希尔FISCHER测厚仪-铁素体检测仪-上海吉馨实业发展有限公司 | 机床主轴维修|刀塔维修|C轴维修-常州翔高精密机械有限公司 | 氧化铝球_高铝球_氧化铝研磨球-淄博誉洁陶瓷新材料有限公司 |