赞
踩
在Spring Boot中,异步任务是一种机制,允许将某些方法或操作异步执行,以提高应用程序的性能和响应性。通过使用Spring的异步支持,你可以让某个方法在单独的线程中执行,而不必等待其完成,从而避免阻塞主线程。
Spring Boot的异步任务通常使用以下几个核心注解:
@EnableAsync:
@Async:
举个简单的开发场景:
假如管理员要发布一条消息,需要向数据库添加一条消息,并且将消息通知给所有用户,但是呢通知的用户量超级大,执行起来就比较慢,所以就可以将通知用户的逻辑使用异步的方式进行修改。
- @SpringBootApplication
- @EnableAsync//开启异步任务支持
- public class ApplicationStarter {
- public static void main(String[] args) {
- SpringApplication.run(ApplicationStarter.class,args);
- }
- }
注意:如果你部署的服务器本身是单核的,就算创建线程池其实也不会提高执行效率,实际上还是串行的。
- @Configuration
- public class ExcuterConfig {
-
- /**
- * 配置异步任务执行器
- * @return 返回一个ThreadPoolExecutor对象,用于异步任务的执行
- */
- @Bean(name = "myTaskExecutor")
- public ThreadPoolExecutor getAsyncExecutor() {
- // 创建一个ThreadPoolExecutor对象,用于执行异步任务
- // 设置核心线程数为3,最大线程数为6,空闲线程60秒后被回收
- // 使用LinkedBlockingDeque作为任务队列,最大容量为10000
- return new ThreadPoolExecutor(3, 6, 60, TimeUnit.SECONDS, new LinkedBlockingDeque<>(10000));
- }
- }
- @PostMapping("/addMessage")
- public ResultInfo<String> addMessage(@RequestBody @Valid Message message) {
- if (message == null) {
- return new ResultInfo<String>().error("请传递message参数");
- }
- try {
- long startTime = System.currentTimeMillis();
- //添加消息到Message数据库
- Integer messageId = messageService.addMessage(message);
- if (messageId!=0) {
- //异步新增数据到UserMessage库中
- messageService.asyncBatchInsertUserMessage(messageId);
- long endTime = System.currentTimeMillis();
- System.out.println("同步执行时间:" + (endTime - startTime) + "毫秒");
- return new ResultInfo<String>().succeed("新增消息成功");
- } else {
- return new ResultInfo<String>().error("新增消息失败");
- }
-
- } catch (Exception ex) {
- logger.error("服务器异常,请稍后重试!" + ex.getMessage());
- return new ResultInfo<String>().interrupt(ex.getMessage());
- }
- }
同步添加消息表
- @Override
- @Transactional
- public Integer addMessage(Message message) {
- try {
- message.setNoticeTime(new Date());
- long startTime = System.currentTimeMillis();
- // 直接进行修改
- messageMapper.addMessage(message);
- // 应该对数据库中所有用户进行通知
- // 保存后生成的自增长id
- Integer messageId = message.getId();
- System.out.println("新增消息的message_id:" + messageId);
- return messageId;
- } catch (Exception e) {
- // 添加过程中发生异常,可以进行日志记录等操作
- log.error("Error addMessage message: {}", e.getMessage(), e);
- return 0;
- }
- }
异步添加用户信息表
- @Override
- @Async("myTaskExecutor")
- public void asyncBatchInsertUserMessage(Integer messageId) {
- try {
- long startTime = System.currentTimeMillis();
- List<Users> userList = userMapper.findAll();
-
- // 批量插入UserMessage
- if (!userList.isEmpty()) {
- userMessageMapper.batchInsert(userList);
- }
- long endTime = System.currentTimeMillis();
- System.out.println("异步执行时间:" + (endTime - startTime) + "毫秒");
- System.out.println("异步执行");
- } catch (Exception e) {
- // 异常处理
- log.error("异步发布消息给用户失败,对刚才发布的消息进行删除: {}", e.getMessage(), e);
- messageMapper.deleteById(messageId);
- }
- }
这样就使用SpringBoot实现了一个简单的异步功能。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。