Tomcat并发请求数:500个左右,所以大型电商不得不把应用部署到多个服务器上
那么如果都是耗时请求,500个请求过来都把资源占用着,那么其他请求就处理不了
所以尽量把非关键操作定义成异步执行的,那么让主操作先返回客户一个结果
比如充值话费,马上告诉你充值成功,过好久,突然一条信息告诉你充值不成功。充值操作放在一个队列中执行。
日志操作,写日志这是系统功能,跟业务没有关系,所以属于非关键操作。那么可以异步执行。
多以需要定义异步任务,提供系统的吞吐量。
1.定义Service中的方法为异步执行方法,方法上加个注解@Async
@Service
public class LogService {
private Logger logger=LoggerFactory.getLogger(getClass());
@Async//这个注解表示该方法为异步调用,和调用者的其他代码不是顺序执行的
public String test()
{
//同步执行
synchronized (this) {
try {
for (int i = 0; i < 100; i++) {
logger.info(Thread.currentThread().getName()+"............异步执行");
}
return "执行异步任务完成";
}catch(Exception e)
{
//e.printStackTrace();
logger.info("抛出异常了:"+e.getMessage());
}
}
return Thread.currentThread().getName()+"执行完毕";
}
}
2.定义controller调用service让大家看到异步效果,controller已经返回结果了,但是service中的方法还在执行
@RestController
@EnableAsync//开启异步任务,springboot规定谁调用异步任务,那么谁开启异步任务,所以加个注解@EnableAsync
public class UserController {
private Logger logger=LoggerFactory.getLogger(getClass());
@Autowired
private LogService logService;
@RequestMapping("test")
public String test()
{
logService.test();
logger.info("==================>"+Thread.currentThread().getName());
return "异步,正在解析";
}
}