Springboot整合非同步任務
阿新 • • 發佈:2018-11-26
Springboot非同步執行使用場景
- 傳送簡訊
- 傳送郵件
- App訊息推送
- 節省運維凌晨釋出任務時間提供效率
Springboot非同步執行程式
- 使用註解@EnableAsync開啟非同步,會自動掃描
- 定義@Component @Async作為元件被容器掃描執行
@SpringBootApplication //掃描 mybatis mapper 包路徑 @MapperScan(basePackages = "com.imooc.mapper") //掃描 所有需要的包, 包含一些自用的工具類包 所在的路徑 @ComponentScan(basePackages= {"com.imooc", "org.n3r.idworker"}) //開啟定時任務 @EnableScheduling //開啟非同步呼叫方法 @EnableAsync public class ImoocApplication { public static void main(String[] args) { SpringApplication.run(ImoocApplication.class, args); } }
@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); } }
@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; } }
用時1008ms,說明幾個任務非同步執行