作者:Mars酱
声明:本文章由Mars酱编写,部分内容来源于网络,如有疑问请联系本人。
转载:欢迎转载,转载前先请联系我!
前言
实现异步方式还有很多,我认为Spring 的 @Async注解 和 ApplicationEvent 事件机制也是异步实现的一种可选方案。废话很多,上车再废话~
@Async注解
Spring的@Async注解一般我们这么写:
@Async
public void runTask(){
// 业务处理
}
既然是异步,那么就会分两种,一种是无返回值,一种有返回值。如果是无返回值,就像上面那样写就ok,如果有返回值,一般这样写:
@Async
public Future<Object> notifyUserAndReturn() {
// 业务处理
return new AsyncResult<>(Object);
}
Future
这个玩意还记得吗?就是 4 - Future异步 那篇的东西。不记得就点回去再回忆回忆。
ApplicationEvent事件
Spring里面还有个ApplicationEvent事件,可能用的人不太多,但是也是实现异步的一个方式。
首先,我们会先定义个监听,一般采用注解的方式:
@EventListener(Object.class)
public void run(Object event) {
// 你的业务
}
添加一个@EventListener注解,表示这个类的函数数据监听,如果有地方触发了时间,这个run函数就会被运行。监听的地方不要写Object,应该是定义个事件的实体对象,比如:UserInfo。
事件触发的地方,一般这么写:
SpringContextHolder.publishEvent(Object);
通过SpringContextHolder对象,发送事件广播。注意:不要写Object对象,应该发送的是具体事件的实体对象,比如:UserInfo
最后结束
总算爽完了~,来总结一下:
实现异步的方式有很多,可以使用JDK原生的,也可以使用消息中间件的,还能使用开源框架的,具体看你的需求了,如果你单体架构,也不关心返回值,那么直接线程异步吧。如果任务之间的依赖多,改变多,那可以选择JDK的Future、CompletableFuture。如果你是互联网架构,高并发、高可用、高性能是你们家常便饭,那么你干脆独立搭建一套完整的mq消息队列服务,业务组相互生产或消费topic,中间异步的事情交给专业的消息队列服务,而且性能和稳定性也有保障。
回到初衷,为什么要用异步?
目的就是为了减轻当前线程的压力。如果当前线程被耗时的任务、琐碎且不重要的任务浪费资源,那就可以考虑使用异步来解决。