简介
本文章详细介绍Spring Boot中如何利用Event 事件机制,编程实现异步 处理一些比较耗时间的操作。
预习知识
您需要熟悉Spring boot项目开发;
您需要了解lombok的简单使用;
项目目录结构
config 目录下面,存放了一个异步事件的配置,代码看下面
controller 下面是web api的相关源代码
event.listener目录下面,是异步执行器,用于监听事件publish, 然后执行任务
event.vo 下面是事件Message结构体, 用于承载消息结构, 它会被New 创建实体,并赋值。 由Publisher发布事件,由Listener监听事件,解析有用的信息。
开始
您可以新建一个项目,采用spring boot 1.x或者2.x 都是可以的,下图以IDEA 开发工具为例,新建项目,选择Spring Intializr
web项目开发,需要选择Spring web组件
创建项目之后,可以按照上面的目录结构,存放源代码
src\main\java\com\netroby\eventsugar\config\A
先看异步事件配置文件
package com.ne; import org.; import org.; import org.; import org.; import org.; @Configuration public class AsynchronousSpringEventsConfig { @Bean(name = "applicationEventMulticaster") public ApplicationEventMulticaster simpleApplicationEventMulticaster() { SimpleApplicationEventMulticaster eventMulticaster = new SimpleApplicationEventMulticaster(); even(new SimpleAsyncTaskExecutor()); return eventMulticaster; } }
源代码定义了一个独立的Configuration, 在Spring boot启动的时候,会被自动加载,定义的applicationEventMulticaster是描述了事件协调器(caster)的工作模式,这里定义的是一个多播(可以被多重消费的事件)
然后设置执行器 为一个简单的异步执行器(它会在后台异步执行,无阻塞)
异步执行器,前端用户访问接口的时候,是没有感知的,执行时,是后台执行。
然后我们看 src\main\java\com\netroby\eventsugar\controller\HelloCon
package com.ne; import com.ne; import org.; import org.; import org.; import javax.anno; @RestController public class HelloController { @Resource private ApplicationEventPublisher eventPublisher; @GetMapping("/") public String homeAction() { MovieSubscribeEventVo ev = new MovieSubscribeEventVo(); ev.setId("7789"); ev.setName("八百"); even(ev); return "hello"; } }
控制器引用了一个ApplicationEventPublisher, 它是事件的广播发布组件,利用PublishEvent方法,把我们定义的消息,可以发送出去,系统内进行多播广播。
消息里面有一个Id, 一个Name
我们看下消息体的定义: src\main\java\com\netroby\eventsugar\event\vo\MovieSub
package com.ne; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; @Data @Builder @NoArgsConstructor @AllArgsConstructor public class MovieSubscribeEventVo { String id; String name; }
接下来看一下事件监听组件 src\main\java\com\netroby\eventsugar\event\listener\MovieSub
package com.ne; import com.ne; import lombok.ex; import org.; import org.; import org.; @Component @Slf4j public class MovieSubscribeEventListener { @Async @EventListener public void handleEvent(MovieSubscribeEventVo event) { String currentMethod = "handleEvent@MovieSubscribeEventListener"; log.info(currentMethod + " event: {}", event.toString()); } }
监听器设置了@Component 注解,所以项目启动时候,会被加载,handleEvent方法有两个注解,一个@Async, 一个@EventListener, 表示异步,以及它是一个时间监听器方法
方法有一个参数, 注意类型,MovieSubscribeEventVo, 表示它监听的是这样一个类型的消息体,只要系统广播中的消息,匹配到这个类型,就会触发这个方法
那么这个example示例里面,我们只是简单打印了log,其实你可以把它换成你想要的方法,比如发一个邮件通知,写一些信息到数据库等。
执行的结果
2020-10-28 08:47:10.814 INFO 6460 --- [TaskExecutor-12] c.n.e.e.l.MovieSubscribeEventListener : handleEvent@MovieSubscribeEventListener event: MovieSubscribeEventVo(id=7789, name=八百)
这个异步的消息通知,被监听到了,消息传递来的数据, id为7789, name 为八百,刚好是我们publisher发送的消息
总结
以上本文,就是如何在Spring boot中进行异步消息Event通知的开发,只要你了解了这些基本概念,接下来,你就可以干大事业了。
喜欢的话,可以关注一下,更多精彩,等你来。