摘要
- 異步調(diào)用傳統(tǒng)SSM項(xiàng)目實(shí)現(xiàn)
- 異步調(diào)用SpringBoot實(shí)現(xiàn)
Async簡(jiǎn)介:
異步方法調(diào)用使用場(chǎng)景:處理日志、發(fā)送郵件和措、短信......
spring中提供了@Async來(lái)實(shí)現(xiàn)異步方法绘雁。
@Async修飾類辆憔,則該類所有方法都是異步的,@Async修飾方法,則該方法是異步的。
被修飾的方法在被調(diào)用時(shí),會(huì)在一個(gè)新的線程中執(zhí)行刁标。
實(shí)現(xiàn)
傳統(tǒng)SSM項(xiàng)目實(shí)現(xiàn)
- AsyncTask類
@Component
public class AsyncTask {
protected static Logger logger = LoggerFactory.getLogger(AsyncTask.class);
@Async
public void doSomeThing(String s){
logger.info("son"+Thread.currentThread());
//doSomeThing
logger.info(s);
}
}
AsyncTask類中也可以注入LogService來(lái)往數(shù)據(jù)庫(kù)記日志
- xml文件配置
<!-- 激活組件掃描功能,掃描aop的相關(guān)組件組件 -->
<context:component-scan base-package="com.gs"/>
<!-- 支持異步方法執(zhí)行 -->
<task:annotation-driven />
<!-- 支持異步方法執(zhí)行 以下是配置執(zhí)行器的方式 -->
<!--<task:annotation-driven executor="myExecutor" scheduler="defaultTaskScheduler" />-->
<!--<bean id="myExecutor" class="com.gs.teacher.task.MyExecutor">-->
<!--<constructor-arg ref="defaultTaskExecutor" />-->
<!--</bean>-->
<!--<task:executor id="defaultTaskExecutor" pool-size="5" />-->
<!--<task:scheduler id="defaultTaskScheduler" pool-size="1" />
若不配置執(zhí)行器,則使用默認(rèn)的執(zhí)行器址晕。
- Controller注入
@Controller
@RequestMapping("teacher")
public class TeacherController {
protected static Logger logger = LoggerFactory.getLogger(TeacherController.class);
@Autowired
private ITeacherService teacherService;
@Autowired
private AsyncTask asyncTask;
@RequestMapping(value = "/get/{id}", method = RequestMethod.GET)
@ResponseBody
public BaseResult<TeacherVO> get(@PathVariable("id")Integer id){
TeacherVO vo = teacherService.getVOById(id);
logger.info("main"+Thread.currentThread());
asyncTask.doSomeThing("do Something");
return new BaseResult<TeacherVO>(true, vo);
}
}
- 執(zhí)行結(jié)果
INFO[com.gs.teacher.controller.TeacherController:36]- mainThread[http-apr-8082-exec-7,5,main]
INFO[com.gs.teacher.task.AsyncTask:15]- sonThread[defaultTaskExecutor-1,5,main]
SpringBoot實(shí)現(xiàn)
SpringBoot的實(shí)現(xiàn)方式很簡(jiǎn)單
- AsyncTask類
@Component
public class AsyncTask {
protected static Logger logger = LoggerFactory.getLogger(AsyncTask.class);
@Async
public void doSomeThing(String s){
logger.info("son"+Thread.currentThread());
//doSomeThing
logger.info(s);
}
}
- Application上加注解
@SpringBootApplication
@EnableAsync
public class Application extends SpringBootServletInitializer {
protected final static Logger logger = LoggerFactory.getLogger(Application.class);
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}
這種配置不指定Executor膀懈,會(huì)使用默認(rèn)的Executor
- Controller注入
@Controller
@RequestMapping("teacher")
public class TeacherController {
protected static Logger logger = LoggerFactory.getLogger(TeacherController.class);
@Autowired
private ITeacherService teacherService;
@Autowired
private AsyncTask asyncTask;
@RequestMapping(value = "/get/{id}", method = RequestMethod.GET)
@ResponseBody
public BaseResult<TeacherVO> get(@PathVariable("id")Integer id){
TeacherVO vo = teacherService.getVOById(id);
logger.info("main"+Thread.currentThread());
asyncTask.doSomeThing("do Something");
return new BaseResult<TeacherVO>(true, vo);
}
}
- 執(zhí)行結(jié)果
INFO[com.gs.teacher.controller.TeacherController:36]- mainThread[http-apr-8082-exec-7,5,main]
INFO[com.gs.teacher.task.AsyncTask:15]- sonThread[defaultTaskExecutor-1,5,main]
復(fù)制上面的執(zhí)行結(jié)果。谨垃。启搂。懶得跑了
- pringBoot配置Executor
/**
* @author gs
* @create 2017/11/21
* @desc 異步方法調(diào)用的Executor
*/
@Configuration
@EnableAsync
public class ExecutorConfig {
/** 初始線程數(shù). */
private int corePoolSize = 10;
/** 最大線程數(shù). */
private int maxPoolSize = 200;
/** 阻塞隊(duì)列大小. */
private int queueCapacity = 10;
@Bean
public Executor mySimpleAsync() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(corePoolSize);
executor.setMaxPoolSize(maxPoolSize);
executor.setQueueCapacity(queueCapacity);
executor.setThreadNamePrefix("MySimpleExecutor-");
executor.initialize();
return executor;
}
}
新建配置文件ExecutorConfig將Application上的@EnableAsync移至此處
- AsyncTask文件@Async指定執(zhí)行器
@Component
public class AsyncTask {
protected static Logger logger = LoggerFactory.getLogger(AsyncTask.class);
@Async("mySimpleAsync")
public void doSomeThing(String s){
logger.info("son"+Thread.currentThread());
//doSomeThing
logger.info(s);
}
}
- 執(zhí)行結(jié)果
INFO[com.gs.teacher.controller.TeacherController:36]- mainThread[http-apr-8082-exec-7,5,main]
INFO[com.gs.teacher.task.AsyncTask:15]- sonThread[mySimpleAsync-1,5,main]
改了一下上面的執(zhí)行結(jié)果。刘陶。胳赌。真的懶得跑了!