Spring event 使用完全指南
说明
此篇文章以 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 |
关注我们
扫描上面二维码,更多精彩内容每天推荐!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
kubernetes 使用NFS搭建动态存储卷(PV/SorageClass/PVC)
在日常学习测试kubernetes时,经常需要PersistentVolume把一些数据(例如:数据库、日志等)存储起来,不随着容器的删除而丢失;关于PV、PVC、StorageClass的关系参考PV/PVC/StorageClass;存储卷的实现有很多种,此处选择比较容易实现的NFS作为存储;参考了网上好多资料,但都是不太完整,按照资料上的说明操作都有问题,所以在参考了众多资料之后决定记录一下过程,以供各位参考。 环境: centos-7(3.10.0-957.5.1.el7.x86_64)(node1, node2) kubernetes v1.13.0 helm v2.12.0 安装环境 安装kubernetes、helm 参考资料,在node1、node2上安装kubernetes和helm; 安装NFS 在node1上安装NFS Server $ sudo yum -y install nfs-utils rpcbind 在服务端node1上配置共享目录 $ sudo mkdir /var/nfs $ sudo su //切换到root用户 $ echo "/var/nfs...
- 下一篇
你都理解创建线程池的参数吗?
微信公众号「后端进阶」,专注后端技术分享:Java、Golang、WEB框架、分布式中间件、服务治理等等。 老司机倾囊相授,带你一路进阶,来不及解释了快上车! 多线程可以说是面试官最喜欢拿来问的题目之一了,可谓是老生之常谈,不管你是新手还是老司机,我相信你一定会在面试过程中遇到过有关多线程的一些问题。那我现在就充当一次面试官,我来问你: 现有一个线程池,参数corePoolSize = 5,maximumPoolSize = 10,BlockingQueue阻塞队列长度为5,此时有4个任务同时进来,问:线程池会创建几条线程? 如果4个任务还没处理完,这时又同时进来2个任务,问:线程池又会创建几条线程还是不会创建? 如果前面6个任务还是没有处理完,这时又同时进来5个任务,问:线程池又会创建几条线程还是不会创建? 如果你此时一脸懵逼,请不要慌,问题不大。 创建线程池的构造方法的参数都有哪些? 要回答这个问题,我们需要从创建线程池的参数去找答案: java.util.concurrent.ThreadPoolExecutor#ThreadPoolExecutor: public Thread...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Hadoop3单机部署,实现最简伪集群
- CentOS关闭SELinux安全模块
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- MySQL8.0.19开启GTID主从同步CentOS8