• springboot异步操作之Async


    前言

    最近看了下springboot的异步操作,学到了使用async注解来实现异步操作的功能,这不就立马把项目中的发送邮件通知就都换成了异步的操作,而不是去新建一个线程来发送通知,虽然async注解也是通过新线程的方式来实现,但就很美观。下面就来看看async的简单示例

    1. 启动类添加注解@EnableAsync
    @SpringBootApplication
    @MapperScan(basePackages = {"com.fyg.mapper"})
    @ServletComponentScan
    @EnableAsync
    public class BlogApplication {
        public static void main(String[] args) throws UnknownHostException {
            ConfigurableApplicationContext application = SpringApplication.run(BlogApplication.class, args);
            Environment env = application.getEnvironment();
            String ip = InetAddress.getLocalHost().getHostAddress();
            String port = env.getProperty("server.port");
            String path = env.getProperty("server.servlet.context-path");
            System.out.println("\n----------------------------------------------------------\n\t" +
                    "blog is running! Access URLs:\n\t" +
                    "Local: \t\thttp://localhost:" + port + path + "/\n\t" +
                    "External: \thttp://" + ip + ":" + port + path + "/\n\t" +
                    "Knife4j-ui: \thttp://" + ip + ":" + port + path + "/doc.html\n\t" +
                    "----------------------------------------------------------");
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    2. 在使用的方法上添加注解@Async
        @Async("threadPoolTaskExecutor")
        public void emailNoticeMe(String subject,String content) {
            // 构建一个邮件对象
            SimpleMailMessage message = new SimpleMailMessage();
            // 设置邮件主题
            message.setSubject(subject);
            // 设置邮件发送者
            message.setFrom(Objects.requireNonNull(javaMailSender.getUsername()));
            // 设置邮件接收者,可以有多个接收者,中间用逗号隔开
            message.setTo("1248954763@qq.com");
            // 设置邮件发送日期
            message.setSentDate(new Date());
            // 设置邮件的正文
            message.setText(content);
            // 发送邮件
            javaMailSender.send(message);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    可以指定线程池的名称,以上代码我是已经指定了,不指定名称就会使用默认的线程池

    3.调用
        @Transactional(rollbackFor = Exception.class)
        public ResponseResult applyFriendLink(FriendLink friendLink) {
    
            Assert.isTrue(StringUtils.isNotBlank(friendLink.getUrl()),"输入正确的网址!");
            friendLink.setStatus(APPLY.getCode());
    
            Assert.isTrue(!friendLink.getUrl().contains("fyg.com") &&
                    !friendLink.getUrl().contains("baidu.com"),"不合法的网址!");
    
            //如果已经申请过友链 再次接入则会进行下架处理 需重新审核
            FriendLink entity = baseMapper.selectOne(new QueryWrapper<FriendLink>()
                    .eq(SqlConf.URL,friendLink.getUrl()));
            if (entity != null) {
                friendLink.setId(entity.getId());
                baseMapper.updateById(friendLink);
            }else {
                baseMapper.insert(friendLink);
            }
            //异步操作邮箱发送
            emailService.emailNoticeMe("友链接入通知","网站有新的友链接入啦("+friendLink.getUrl()+"),快去审核吧!!!");
            return ResponseResult.success();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    需要注意的是调用方法和被调用方法不能在同类中,否则就会失效

  • 相关阅读:
    直冲云霄,阿里大牛耗时49天整理12W字面试手册,押题准确率直冲95%
    必看,关于sql的慢查询及解决方案
    Discourse 如何在 header 上添加 HTML
    【JavaSpring】Aop切入点表达式
    红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写
    【SICP】引入与教学大纲
    idea中maven优先从本地仓库寻找依赖包的配置
    郁金香2021年游戏辅助技术(初级班)(中)
    PMP模拟题 | 每日一练,快速提分
    git与github的交互(文件与文件夹的上传)
  • 原文地址:https://blog.csdn.net/qq_46077249/article/details/133349446