spring boot(17)-@Async非同步_spring

來源:互聯網
上載者:User
驗證碼的非同步機制


上一篇講過可以用郵件發驗證碼,通常我們在某網站發驗證碼時,首先會提示驗證碼已發送,請檢查郵箱或者簡訊,這就是圖中的1和3。然而此時查看郵箱或簡訊可能並沒有收到驗證碼,往往要過幾秒種才真正收到,這就是圖中的2和4。2和4所消耗的時間比1和3要多,如果是同步,先執行4後執行3,那麼這個請求將一直佔用後台伺服器。如果是非同步,可以在第一時間通知使用者已發送,並釋放請求,而完全不用去管2和4的執行過程。如果2和4執行不成功怎麼辦。在驗證碼提示訊息結尾,我們經常可以看到:”如果你在XXX秒鐘之內沒有收到驗證碼,請重發“ @Async和@EnableAsync 實現非同步 控制層
[java] view plain copy @GetMapping("/async")   public String test1() throws InterruptedException {       helloService.task1();       helloService.task2();       System.out.println("釋放請求");       return "ok";   }   服務層 [java] view plain copy @Async   public void task1() throws InterruptedException{       Thread.sleep(2000);       System.out.println("完成任務1");   }   @Async   public void task2() throws InterruptedException{       Thread.sleep(1000);       System.out.println("完成任務2");   }   這是在一個控制層中調用了兩個服務層的方法,任務1需要執行2秒時間,任務2需要執行1秒時間。和普通方法的唯一區別就是非同步方法呼叫上加了@Async
上圖是執行結果 ,這是同步。如果要讓@Async非同步生效還需要在配置類中開啟非同步,如下 [java] view plain copy @EnableAsync   @SpringBootApplication   再次執行
執行順序和前面完全顛倒,在第一時間就釋放了請求,任務2和任務1是同時執行的,但是任務2時間短,所以比任務1先執行完。
應用情境 這個非同步實際上就是spring封裝了一個基本的多線程功能,每個@Async都會開啟一個新的線程,並且 在內部使用了線程池。非同步線程執行完後並沒有回調方法得知任務是否執行成功,在一般的web情境下,非同步回調是在前端用ajax的方式來實現的,一個頁面可以有多個ajax,每個ajax去獨立完成一個後台業務,誰先完成誰先響應,彼此互不干涉。後台業務則應該是彼此獨立的以供ajax調用,如果在後台回調意味著多個業務任務整合到一個請求,而且這個請求的回應時間要按最慢的那個任務計算。所以這種後台非同步只適用於對請求結果即時性要求不高的情境,不建議在後台使用回調。這也是我在第三篇Rest風格介面中講過的,使用靜態html+ajax,而不用動態jsp的原因之一。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.