说明
此篇文章以 Spring 4.2+ 为例,在此版本之前略微有不同。
笔者自2014年起开始接触和使用 Spring event,根据 Spring event 的原理开发了 JFinal-event: https://gitee.com/596392912/JFinal-event ,方便 JFinal 用户使用,JFinal event 2.x 也同步成 Spring 4.2.x+ 的使用方式,不再需要创建多个 Listener 类,使用更加简单方便。
使用
创建 Event 事件监听
Spring 4.2+ 中不再需要单独编写监听器类,只需要在 Spring Bean 的方法上标记 @EventListener
注解即可。
示例:多个监听器,监听 Account
创建,完成不同的业务逻辑。
/**
* 账号监听,处理账号创建成功的后续逻辑
*/
@Component
public class AccountListener {
/**
* 1. 发送邮件、短信
*/
@EventListener
public void processAccountCreatedEvent1(AccountCreatedEvent event) {
// TODO
}
/**
* 2. 添加积分等,@Order(100) 用来设定执行顺序
*/
@EventListener
@Order(100)
public void processAccountCreatedEvent2(AccountCreatedEvent event) {
// TODO
}
/**
* 3. 创建 lucene 索引等,@Async 用来标记为异步线程池中执行
*/
@EventListener
@Async
public void processAccountCreatedEvent3(AccountCreatedEvent event) {
// TODO
}
}
发送 Event 事件
示例:mybatis中发送账号创建事件。
注意:如果你是使用的 jpa,jpa 也有对应的事件机制,不需要像下面手动处理。
/**
* 注入 ApplicationEventPublisher
*/
@Autowired
private ApplicationEventPublisher publisher;
@Override
public boolean save(Account account) {
// 伪代码,数据库保存成功
if (true) {
publisher.publishEvent(new AccountCreatedEvent(account));
}
return false;
}
idea 中的快捷跳转按钮
@EventListener
注解属性说明
@EventListener(value = {AccountCreatedEvent.class, AccountUpdatedEvent.class}, condition = "#event.account.age > 10")
public void processAccountCreatedEvent2(AccountEvent event) {
// TODO
}
-
value
和classes
作用相同,表示监听的一个或一组事件,用于支持方法中同一个父类的事件,例如AccountEvent
; -
condition
表达式,支持 Spring el,用来做 event 中的变量或者方法判断。
监听执行顺序
可以使用 @Order(100)
注解来标记事件的监听执行顺序,异步的情况下只保证按顺序将监听器丢入进线程池,具体执行得看线程的心情 -.-
监听异步执行
使用 @Async
标记即可,注意前提条件是:使用 @EnableAsync
开启 Spring 异步。
Spring boot 配置异步
本节以 mica 中的异步配置为基础讲解。
异步配置
- @EnableAsync 开启异步。
- @EnableScheduling 开启定时任务。
- MicaAsyncProperties 为异步线程池的配置。
异步配置项
配置项 | 默认值 | 说明 |
---|---|---|
mica.async.core-pool-size | 2 | 异步核心线程数,默认:2 |
mica.async.keep-alive-seconds | 300 | 线程存活时间,默认:300 |
mica.async.max-pool-size | 50 | 异步最大线程数,默认:50 |
mica.async.queue-capacity | 10000 | 队列容量,默认:10000 |
精品开源推荐
-
mica
Spring boot 微服务核心组件集:https://gitee.com/596392912/mica -
Avue
一款基于vue可配置化的神奇框架:https://gitee.com/smallweigit/avue -
pig
宇宙最强微服务(架构师必备):https://gitee.com/log4j/pig -
SpringBlade
完整的线上解决方案(企业开发必备):https://gitee.com/smallc/SpringBlade -
IJPay
支付SDK让支付触手可及:https://gitee.com/javen205/IJPay