ApplicationEventPublisher 事件发布器
一、介绍
功能就是发布事件,也就是把某个事件告诉的所有与这个事件相关的监听器。
1、使用ApplicationEventPublisher 可以进行事件发布
2.ApplicationListener
ApplicationListener接口是由 Spring 提供的事件订阅者必须实现的接口,我们一般把该 Service 关心的事件类型作为泛型传入
二、示例demo
1.定义事件
// 用户事件
@Getter
@AllArgsConstructor
public class UserEvent {
private String username;
}
// 短信事件
@Getter
@AllArgsConstructor
public class SmsEvent {
private String phone;
}
2.注册完成后发送短信 以及注册的事件
@Autowired
private ApplicationEventPublisher publisher;
@GetMapping("/zc")
public String zc() {
log.info("注册完成");
publisher.publishEvent(new UserEvent("zhangsan"));
publisher.publishEvent(new SmsEvent("1560000"));
log.info("succs");
return "succs";
}
3、监听
@Component
@Slf4j
public class EventHandleListener {
@Async
@EventListener(UserEvent.class)
public void zc(UserEvent userEvent){
log.info( Thread.currentThread().getName()+ " 注册监听到:{}", JSONUtil.toJsonStr(userEvent));
}
@EventListener(SmsEvent.class)
public void sms(SmsEvent smsEvent){
log.info( Thread.currentThread().getName()+ " sms监听到:{}", JSONUtil.toJsonStr(smsEvent));
}
}
如果有需要可以配置优先级
@Order(Ordered.LOWEST_PRECEDENCE-1)
@EventListener(MessageOwnerEvent.class)
public void removeImportError(MessageOwnerEvent messageEvent)
4、开启异步
@EnableAsync
public class DemoApplication
@Async
@EventListener(UserEvent.class)
public void zc(UserEvent userEvent)
配置异步线程池
@Configuration
@EnableAsync
public class AsyncEventConfiguration implements AsyncConfigurer {
@Override
public Executor getAsyncExecutor() {
return Executors.newFixedThreadPool(10);
}
}
测试
注册完成
http-nio-7000-exec-2 sms监听到:{"phone":"1560000"}
task-1 注册监听到:{"username":"zhangsan"}
succs
-- 异步实现了
5、事务处理
Spring事务监听机制—使用@TransactionalEventListener处理数据库事务提交成功后再执行操作
在项目中,往往需要执行数据库操作后,发送消息或事件来异步调用其他组件执行相应的操作,例如:
用户注册后发送激活码等。
但是,数据库的操作如果还未完成,此时异步调用的方法查询数据库发现没有数据,这就会出现问题。
为了解决上述问题,Spring为我们提供了两种方式:
(1) @TransactionalEventListener注解
只有当前事务提交之后,才会执行事件监听器的方法。其中参数phase默认为AFTER_COMMIT
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
@EventListener(SmsEvent.class)
public void sms(SmsEvent smsEvent){
log.info( Thread.currentThread().getName()+ " sms监听到:{}", JSONUtil.toJsonStr(smsEvent));
}
参考:https://blog.csdn.net/u012843873/article/details/113364753
本地代码 learnCode

浙公网安备 33010602011771号