异步任务使用方式
Spring 异步任务需要在相关的方法上设置 @Async
注解,这里为了举例,我们创建一个 EmailService
类,专用完成邮件服务。
代码如下所示:
@Slf4j
@Service
public class EmailService {
/**
* 异步发送任务
*
* @throws InterruptedException
*/
@SneakyThrows
@Async
public void sendEmailAsync() {
log.info("使用 Spring 异步任务发送邮件示例");
// 模拟邮件发送耗时
TimeUnit.SECONDS.sleep(2l);
}
}
这里要注意了,Spring 异步任务默认关闭的,我们需要使用 @EnableAsync
开启异步任务。
如果还在使用 Spring XML 配置,我们需要配置如下配置:
<task:annotation-driven/>
上述配置完成之后,我们只需要在调用方,比如上一层 Controller
注入这个 EmailService
,然后直接调用这个方法,该方法将会在异步线程中执行。
@Slf4j
@RestController
public class RegisterController {
@Autowired
EmailService emailService;
@RequestMapping("register")
public String register() {
log.info("注册流程开始");
emailService.sendEmailAsync();
return "success";
}
}
输出日志如下:
从日志上可以看到,两个方法执行线程不一样,这就说明了EmailService#sendEmailAsync
被异步线程成功执行。
带有返回值的异步任务
上面的异步任务比较简单,但是有时我们有需要获取异步任务返回值。
如果使用线程池执行异步任务,我们可以使用 threadPool#submit
获取返回对象Future
,接着我们就可以调用其内 get
方法,获取返回结果。
在 Spring 异步任务中,我们也可以使用 Future
获取返回结果,示例代码如下:
@Async
@SneakyThrows
public Future<String> sendEmailAsyncWithResult() {
log.info("使用 Spring 异步任务发送邮件,并且获取任务返回结果示例");
TimeUnit.SECONDS.sleep(2l);
return As