springboot @Async 实现异步调用

/ 2021-06-27 / 71人浏览 / 0人评论

springboot异步调用

什么是异步调用

什么是异步调用?举个例子可能会更好理解异步这个说法:

小明家里先后脚来了亲戚以及小明的同学, 正常情况这个时候都是小明妈妈先和家里亲戚客套下,再来照顾下小明的同学,但是小明妈妈发现时间不够用,分身乏术,没法同时去照顾两波人,就让小明去照顾他的同学了。至于小明有没有照顾好他的同学至少不是妈妈当下需要去关心的事情了。这样把两个事情分给两个人处理,可以粗略的认为是异步。

那么具体什么是异步呢?百度词条上是这么形容异步处理的

异步处理就是按照不同步的程序处理问题。异步处理与同步处理是对立的,而产生他们的是多线程或者多进程。异步处理的好处就是提高设备使用率,从而在宏观上提升程序运行效率,但是弊端就是容易出现冲突操作和数据脏读

springboot 实现异步

使用@EnableAsync开启异步

@SpringBootApplication
@EnableScheduling
@EnableAsync   //开启异步处理注解
@MapperScan({"com.java78.mapper"} )
public class OnlineToolsApplication {
	
	public static void main(String[] args) {
		SpringApplication.run(OnlineToolsApplication.class, args);
	}
}

使用 @Async 标识异步方法

使用@Async标记的方法,给返回值没必要,直接void

@Override
@Async
public void viewCountAdd(String id) {
	try {
		this.baseMapper.viewCountAdd(id);
		GlobalData.viewCountAdd();
	} catch (Exception e) {
		e.printStackTrace();
	}
}

此时viewCountAdd方法被调用时就是异步操作

Future<V> 实现异步响应参数接收

异步方法:

@Async
public Future<String> viewCountAdd(String id) {
	return new AsyncResult<>("value");
}

调用方式:

Future<String> task =toolService.viewCountAdd("id"); 
try {
	System.out.println(task.get());
} catch (InterruptedException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
} catch (ExecutionException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
}

全部评论