springbootApplicationEvent事件监听与异步
ApplicationEvent以及个人特点 Listener是Spring为我们提供的⼀个事件监听、订阅的实现,内部实现原理是观察者设计模式,设计初衷是为了系统业务逻辑解耦,提⾼
可扩展性及可维护性。事件发布者并不需要考虑谁去监听,监听具体的内容是什么,监听者也不需要考虑事件是谁发布,只需要将接收到的事件完成即可,个⼈
理解和mq的模式其实有些相似。
从Spring4.2以后,事件处理不⽤实现ApplicationListener的onApplicationEvent⽅法了,使⽤注解@EventListener可以⾃动关联相关的ApplicationListener。
下⾯是⼀段我在项⽬中⽤到的代码⽰例
需求:在⽤户发起订单投诉后像运营⼈员发送⼀条短信提⽰处理⽤户投诉,如果⽤户⼿机为华为⼿机则向⽤户发送⼀条负⼀屏消息提⽰已接
到投诉正在处理。要求发送短息与负⼀屏消息不得影响主流程的正常流转。
定义event事件模型
⾸先定义⼀个event事件模型。ComplaintDTO为事件发布者传送给事件监听者的⼀些信息,⼊投诉的订单信息、客户信息等。可根据⾃⾝
需要进⾏调整,调整之后需要变动相应的get/t⽅法和构造⽅法。
ationEvent;
publicclassComplaintEventextendsApplicationEvent{
privateComplaintDTOcomplaintDTO;
publicComplaintEvent(Objectsource,ComplaintDTOcomplaintDTO){
super(source);
intDTO=complaintDTO;
}
publicC蒙顶甘露 omplaintDTOgetComplaintDTO(){
returncomplain年度工作总结模板 tDTO;
}
publicvoidtComplaintDTO(ComplaintDTOcomplaintDTO){
intDTO=complaintDTO;
}
}
发布事件
@Autowired
privateApplicationEventPublisherapplicationEventPublisher;
@Override
publicComplaintVOcreateComplaint(ComplaintDTOcomplaintDTO){
//TODO你的业回忆英语 务代码
//发负⼀屏消息和短信
try{山竹英文
ComplaintEventcomplaintEvent=newComplaintEvent(this,complaintDTO);
hEvent(complaintEvent);
}catch(Exceptione){
("投诉发短信或负⼀屏消息失败:[{}]",sage());
}
vo=(po,);
returnvo;
}
事件监听者
事件的监听者实现ApplicationListener接⼝,重写onApplicationEvent⽅法实现事件处理
这⾥需要注意的是ApplicationEvent默认并不是异步的,如果需要异步需要我们在⽅法上加上@Async注解,并在启动类添加
@EnableAsync开启异步
@Log4j2
@Component
publicclassComplaintEventListenerimplementsApplicationListener
@Async
@Override
publicvoidonApplicationEvent(ComplaintEventevent){
("订单投诉发短信与负⼀屏消息:[{}]",String(event));
//发短信
try{
ndSmsMsg(event);
}catch(Exceptione){
("订单投诉发短信失败:[{}]",sage());
}
//发负⼀屏消息
try{
ndHwPubMsg(event);
}catch(Exceptione){
("订单投诉发负⼀屏消息失败:[{}]",sage());
}
}
}
从Spring4.2以后,事件处理不⽤实现ApplicationListener的onApplicationE动漫男头像可爱 vent⽅法了,使⽤注解@EventListener可以⾃动关联相关的
ApplicationListener。
所以上⾯的代码其实可以改成成下⾯的样⼦
@Log4j2
@Component
publicclassComplaintEventListener{
@Async
@EventListener
publicvoidndMsg(ComplaintEventevent){
("订单投诉发短信与负⼀屏消息:[{}]",String(event));
//发短信
try{
ndSmsMsg(event);
}catch(Exceptione){
("订单投诉发短信失败:[{}]",sage());
}
//发负⼀屏消息
try{
ndHwPubMsg(event);
}catch(Exceptione){
("订单投诉发负⼀屏消息失败:[{}]",sage());
}
}
}
另外ApplicationEvent还能控制事务,这⾥有⼀篇⼤佬写的⾮常详细的
本文发布于:2023-03-18 10:26:30,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/654a8c31479d0ef8de17a5531c7ea964.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:华为负一屏.doc
本文 PDF 下载地址:华为负一屏.pdf
留言与评论(共有 0 条评论) |