使用Spring事件机制实现异步的方法
时间:2019-04-20
本文章向大家介绍使用Spring事件机制实现异步的方法,主要包括使用Spring事件机制实现异步的方法使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
当把一个事件发布到Spring提供的ApplicationContext中,被监听器侦测到,就会执行对应的处理方法。
事件本身
事件是一个自定义的类,需要继承Spring提供的ApplicationEvent
。
@Data public class MyEvent extends ApplicationEvent { private String msg; public MyEvent(Object source, String msg) { super(source); this.msg = msg; } }
事件监听
基本方法是实现ApplicationListener
接口,自定义一个监听器,实现onApplicationEvent()
方法,然后添加到ApplicationContext
。
比如:
public class MyListener implements ApplicationListener<MyEvent> { @Override public void onApplicationEvent(MyEvent event) { System.out.print("监听到MyEvent事件"); } } ... // SpringBoot的启动类中添加监听器 public static void main(String[] args) { SpringApplication application = new SpringApplication(MyApplication.class); application.addListeners(new MyListener()); application.run(args); }
也可以使用注解@EventListener
(推荐):原理就是通过扫描这个注解,创建监听器并添加到ApplicationContext
。
@Component @Slf4j public class MyEventHandler { @EventListener public void handleEvent(MyEvent event) { log.info("------------处理事件:{}", event.getMsg()); try { Thread.sleep(5 * 1000L); log.info("事件1(5s)处理完成"); } catch (InterruptedException e) { e.printStackTrace(); } } }
事件发布
可以通过上下文对象的发布方法ConfigurableApplicationContext::publishEvent()
来发布。
也可以实现ApplicationEventPublisherAware
接口来发布(推荐)。
@Component @Slf4j public class EventService implements ApplicationEventPublisherAware { public ApplicationEventPublisher publisher; @Override public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) { this.publisher = applicationEventPublisher; } public String doEventWork(String msg) { log.info("------------publish event:" + msg); MyEvent event = new MyEvent(this, msg); publisher.publishEvent(event); return "OK"; } }
测试代码
@SpringBootTest @RunWith(SpringRunner.class) public class EventServiceTest { @Autowired private EventService service; @Test public void eventTest() { String msg="Java Code"; service.doEventWork(msg); } }
注意
如果2个事件之间是继承关系,会先监听到子类事件,处理完再监听父类。
// MyEvent2 extends MyEvent @Component @Slf4j public class MyEventHandler { @EventListener public void handleEvent(MyEvent event) { log.info("------------处理事件:{}", event.getMsg()); try { Thread.sleep(5 * 1000L); log.info("事件1(5s)处理完成"); } catch (InterruptedException e) { e.printStackTrace(); } } @EventListener public void handleEvent2(MyEvent2 event) { log.info("------------处理事件2:{}", event.getMsg()); try { Thread.sleep(10 * 1000L); log.info("事件2(10s)处理完成"); } catch (InterruptedException e) { e.printStackTrace(); } } }
当我publish一个子类事件MyEvent2时,日志如下:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
- python基础知识——内置数据结构(集合)
- 关于db link权限分配的苦旅(二)(r7笔记第45天)
- 简单易学的机器学习算法——在线顺序极限学习机OS-ELM
- Java操作数据库Spring(2)
- 解决SSH连接linux中文显示乱码问题
- 设计模式——类图以及类与类之间的关系
- sysdba登录报错insufficient privileges的原因分析(r7笔记第64天)
- JDBC基础入门(1)
- LeetCode——Add Two Numbers
- python 中numpy基本方法总结可以类推tensorflow
- python基础知识——函数
- tensorflow之tf.placeholder 与 tf.Variable区别对比
- 11g备库搭建碰到自己给自己埋的坑(r7笔记第63天)
- JDBC基础入门(2)
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释