SpringBoot 中发布ApplicationEventPublisher,监听ApplicationEvent 异步操作
有这么一个业务场景:当用户注册后,发送邮件到其邮箱提示用户进行账号激活,且注册成功的同时需要赠送新人用户体验卡券。
业务有了,那么问题也就来了。
What? 问题…问题?我听说你有问题? 来拔刀吧,互相伤害啊。
考虑以下两个问题:如何注册成功立即发送邮件、赠送体验卡? 如何同时向用户邮箱发送激活邮件、赠送新人客户体验卡,互不影响?
如果是微服务项目,该逻辑可结合消息中间件进行处理。若是单机代码,有什么好的办法哇?你还在疯狂的代码逻辑判断吗?若代码高耦合,后期进行维护仿佛并不是那么happy,就不用说在此基础上扩展业务了。
So 请了解下Spring中事件机制:发布ApplicationEventPublisher,实现监听ApplicationEvent。结合异步操作,哎呀,真香!你值得拥有!
下面就跟着楼主的小碎步,慢慢带你带入坑。“气死我了,上才艺。EG埃meng,EG埃meng,EG埃meng。你说我是…”
说归说,闹归闹,不拿代码开玩笑。回归正题,直接上代码。哇哈哈哈哈哈哈…
一、 首先定义下用户类:
楼主示例这个用户类属性写的比较随意,只做测试看效果哈。
二、定义一个Event事件类:
注意:自定义事件类继承ApplicationEvent类,重写方法。
该类中属性根据业务需求自定义即可。
如下所示,楼主定义的Event类叫做UserActionEvent。
EnumUserOperate 枚举类
三、事件类定义好了,我们去定义操作发布:ApplicationEventPublisher,快点跟上别掉队了。
我是在UserServiceImpl中进行事件发布的,如下:
发布者会调用 ApplicationEventPublisher的publishEvent 方法对某一事件进行发布。随后Spring容器会把该事件告诉所有的监听者(我的“女神”有动态了),监听者根据拿到的“信息、某些指令或者某些数据”去做一些业务上的操作。
这个模式常常会与设计模式中观察者模式进行对比。举个栗子:上课铃响了,老师和同学听到铃声后,都来班里了(老师要上课,学生要听课)。在这个事件里,被观察的是“铃声”,“铃声响了”是一种状态,或者说是一种通知。告诉大家:该上课了。
四、发布事件后该定义监听了:
自定义监听方法上方添加注解:@EventListener()。
眼尖的小伙伴会发现,楼主这里使用表达式condition = "#event.operate.name()==‘ADD’"对监听进行了细化:监听类型为“新增”的事件。
注意:自定义监听必须交给spring容器管理,否则不起作用哈。如下图加@Component注解就行(兄弟,交保护费了。额…不交也行,但是必须得跟着spring混…)
@Async()会在下面说
发布和监听都设置好了,使用快乐的postman发送下请求…
测试结果如下:
加了表达式的只会监听到指定类型的事件。当然这里你可以加别的条件,根据业务怎么开心怎么来嘛,对不?
发布和监听可以了,那我并发操作的时候如何保证不会阻塞,互不影响呢?
异步啊,在加个线程池。
问一句:“老哥,为啥加线程池?”
多线程操作,反复创建销毁,性能消耗是很大的。使用线程池降低资源消耗,提高利用率,加上异步操作速度还快,何乐而不为呢。
五、方法异步:
定义方法上方加@Async()注解就好了。
异步方法可以指定使用某一线程池:如 @Async(“lazyTraceExecutor”),lazyTraceExecutor是线程池Bean对象的名字。
六、线程池自定义:
不知道有没有人diss楼主只截图,不贴代码。这不,他来了他来了…
最后,别忘了在启动项上加@EnableAsync注解哦!
想了解ApplicationEventPublisher和ApplicationEvent原理的,认准spring官网happy哈。这里就不过多介绍了。
__EOF__

本文链接:https://www.cnblogs.com/caicz/p/16022579.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理