- package com.weiz;
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- import org.springframework.context.annotation.ComponentScan;
- import org.springframework.scheduling.annotation.EnableAsync;
- import org.springframework.scheduling.annotation.EnableScheduling;
- import tk.mybatis.spring.annotation.MapperScan;
- @SpringBootApplication
- // 扫描 mybatis mapper 包路径
- @MapperScan(basePackages = "com.weiz.mapper")
- // 扫描 所有需要的包, 包含一些自用的工具类包 所在的路径
- @ComponentScan(basePackages = {"com.weiz","org.n3r.idworker"})
- // 开启定时任务
- @EnableScheduling
- // 开启异步调用方法
- @EnableAsync
- public class SpringBootStarterApplication {
- public static void main(String[] args) {
- SpringApplication.run(SpringBootStarterApplication.class, args);
- }
- }
二, 创建异步执行类, 定义 @Component 及 @Async 组件
创建 com.weiz.tasks 包, 在 tasks 包里增加 AsyncTask 异步任务类, 加上 @Component 注解, 然后在需要异步执行的方法前面加上 @Async 注解, 这样 Spring Boot 容器扫描到相关异步方法之后, 调用时就会将这些方法异步执行.
- package com.weiz.tasks;
- import java.util.concurrent.Future;
- import org.springframework.scheduling.annotation.Async;
- import org.springframework.scheduling.annotation.AsyncResult;
- import org.springframework.stereotype.Component;
- @Component
- public class AsyncTask {
- @Async
- public Future<Boolean> doTask11() throws Exception {
- long start = System.currentTimeMillis();
- Thread.sleep(1000);
- long end = System.currentTimeMillis();
- System.out.println("任务 1 耗时:" + (end - start) + "毫秒");
- return new AsyncResult<>(true);
- }
- @Async
- public Future<Boolean> doTask22() throws Exception {
- long start = System.currentTimeMillis();
- Thread.sleep(700);
- long end = System.currentTimeMillis();
- System.out.println("任务 2 耗时:" + (end - start) + "毫秒");
- return new AsyncResult<>(true);
- }
- @Async
- public Future<Boolean> doTask33() throws Exception {
- long start = System.currentTimeMillis();
- Thread.sleep(600);
- long end = System.currentTimeMillis();
- System.out.println("任务 3 耗时:" + (end - start) + "毫秒");
- return new AsyncResult<>(true);
- }
- }
说明:@Async 加上这个注解, 就表示该方法是异步执行方法.
三, 调用
创建一个 DoTask 调用类, 我们看看这几个方法, 是怎么执行的:
- package com.weiz.tasks;
- import java.util.concurrent.Future;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.Web.bind.annotation.RestController;
- @RestController
- @RequestMapping("tasks")
- public class DoTask {
- @Autowired
- private AsyncTask asyncTask;
- @RequestMapping("test1")
- public String test1() throws Exception {
- long start = System.currentTimeMillis();
- Future<Boolean> a = asyncTask.doTask11();
- Future<Boolean> b = asyncTask.doTask22();
- Future<Boolean> c = asyncTask.doTask33();
- while (!a.isDone() || !b.isDone() || !c.isDone()) {
- if (a.isDone() && b.isDone() && c.isDone()) {
- break;
- }
- }
- long end = System.currentTimeMillis();
- String times = "任务全部完成, 总耗时:" + (end - start) + "毫秒";
- System.out.println(times);
- return times;
- }
- }
四, 测试
启动程序之后, 在浏览器输入: http://localhost:8080/tasks/test1 .
从这个总耗时可以看出, 三个方法确实是异步执行的. 耗时接近时间最长的 doTask11 方法.
最后
以上, 就把 Spring Boot 创建异步任务的方法简单介绍完了, 是不是特别简单.
来源: https://www.cnblogs.com/zhangweizhong/p/12540736.html