springboot开启异步任务只需要两个注解:@EnableAsync和@Async。
springboot启动类上添加@EnableAsync注解来使springboot支持异步
@Async可以添加在类上,也可添加在方法上。如果注解在类级别,则表明该类所有的方法都是异步方法,而这里的方法自动被注入使用ThreadPoolTaskExecutor作为TaskExecutor。
需要注意的是@Async并不支持用于被@Configuration注解的类的方法上。同一个类中,一个方法调用另外一个有@Async的方法,注解也是不会生效的。
启动类
package com.example.bootonly;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;
@SpringBootApplication
// 使spring boot支持异步
@EnableAsync
public class BootOnlyApplication {
public static void main(String[] args) {
SpringApplication.run(BootOnlyApplication.class, args);
}
}
异步方法类
package com.example.bootonly.service;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
/**
* @author liujy
* @description 异步方法
* @since 2021-03-17 14:33
*/
// 这个类中的方法都是异步方法
@Async
@Slf4j
@Service
public class TaskService {
public void s() throws InterruptedException {
System.out.println("异步任务start");
// 代替业务代码
Thread.sleep(10000);
System.err.println(Thread.currentThread().getName());
System.out.println("异步任务end");
}
}
Controller
package com.example.bootonly.test;
import com.example.bootonly.service.TaskService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author liujy
* @description
* @since 2021-03-17 14:45
*/
@RestController
public class TaskTest {
@Autowired
private TaskService taskService;
@RequestMapping("/task")
public String task() throws InterruptedException {
System.out.println("controller start");
taskService.s();
System.out.println("controller end");
return "success";
}
}
启动项目,用浏览器发起请求,可以多请求几次,发现可以立即返回success。
而异步任务随后陆续完成: