控制器有一个返回两个数字之和的方法,同时我们想发送一封电子邮件:
@RequestMapping(value = PUBLIC_END_POINT+"/test", method = RequestMethod.POST)
public Integer test(@RequestParam("a") Integer a, @RequestParam("b") Integer b) {
mailService.sendTestMail(a, b);
return a+b;
}
因为 发送邮件的任务很重,用户不关心发送邮件是否成功,他只需要数字a和b,然后他想直接调用发送而不是等待处理sendTestMail()。
想到的最简单的事情是将发送拉入一个新线程:
@RequestMapping(value = PUBLIC_END_POINT+"/test", method = RequestMethod.POST)
public Integer test(@RequestParam("a") Integer a, @RequestParam("b") Integer b) {
new Thread(new Runnable() {
@Override
public void run() {
mailService.sendTestMail(a, b);
}
}).run();
return a+b;
}
我想知道这个解决方案有多优化?(最有趣的是 - 这个线程仍然同步执行)
也许有某种注释可以用来标记方法sendTestMail(),以便它异步运行?
Spring允许异步执行该方法,为此有必要用注释标记被调用的方法@Async:要使此注解起作用,您需要向
@EnableAsync配置类添加注解并添加一个 beanthreadPoolTaskExecutor: