SpringBoot整合非同步任務以及使用場景
阿新 • • 發佈:2018-12-21
一 點睛
使用註解@EnableAsync開啟非同步,會自動掃描
定義@Component @Async作為元件被容器掃描執行
非同步任務執行使用場景
1 傳送簡訊
2 傳送郵件
3 App訊息推送
4 節省運維凌晨釋出任務時間提供效率
二 啟動類
package com.imooc; 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.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); } }
三 控制器
package com.imooc.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; } }
四 非同步任務定義
package com.imooc.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); } }
五 測試