【Spring Boot】22.異步任務

簡介

在Java應用中,絕大多數狀況下都是經過同步的方式來實現交互處理的;可是在處理與第三方系統交互的時候,容易形成響應遲緩的狀況,以前大部分都是使用多線程來完成此類任務。java

其實,在Spring 3.x以後,就已經內置了@Async來完美解決這個問題。web

兩個註解:@EnableAysnc、@Aysncspring

使用步驟

使用異步任務的方式很簡單,只需:多線程

  1. 啓動類開啓異步任務 @EnableASync
  2. 服務方法標註異步註解 @Async

測試

建立一個web項目。app

  1. 建立一個服務類,爲其添加睡眠程序,模擬其執行緩慢:
service/HelloService.class
package com.zhaoyi.cweb.service;

import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

@Service
public class HelloService {


    public void doSomething(){
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
  1. 建立一個controller,映射hello地址並調用service方法:
controller/HelloController.class
package com.zhaoyi.cweb.controller;

import com.zhaoyi.cweb.service.HelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
public class HelloController {

    @Autowired
    HelloService helloService;

    @GetMapping("/hello")
    public String hello(){
        helloService.doSomething();
        return "hello";
    }
}

顯然,咱們訪問/hello的話,要等待3秒才能得到結果。由於 doSomething方法佔用了太多的時間。異步

  1. 咱們添加異步處理,首先須要在啓動類處添加開啓異步任務註解。
App.class
package com.zhaoyi.cweb;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;

@EnableAsync
@SpringBootApplication
public class CwebApplication {

    public static void main(String[] args) {
        SpringApplication.run(CwebApplication.class, args);
    }

}
  1. 而後從服務方法處添加異步註解
service/HelloService.class
package com.zhaoyi.cweb.service;

import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

@Service
public class HelloService {


    @Async
    public void doSomething(){
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

接下來咱們運行項目,訪問一樣的地址就能夠立馬獲得反饋了。測試

異步任務會被java單獨開啓的線程執行,從而保證不阻塞原進程。.net

相關文章
相關標籤/搜索