当前位置: 首页 > 图灵资讯 > 技术篇> springboot异步操作之Async

springboot异步操作之Async

来源:图灵教育
时间:2023-10-09 17:22:26

前言

最近看了springboot的异步操作,学会了使用async注释来实现异步操作的功能。这并没有立即用异步操作取代项目中发送的所有邮件通知,而不是建立一个新的线程来发送通知。虽然async注释也是通过新的线程实现的,但它非常漂亮。让我们来看看async的简单示例

1. 在启动类中添加注释@EnableAsync
@SpringBootApplication@MapperScan(basePackages = {"com.fyg.mapper"})@ServletComponentScan@EnableAsyncpublic 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" +                "----------------------------------------------------------");    }}
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);    }

可以指定线程池的名称。我已经指定了上述代码。如果没有指定名称,将使用默认的线程池

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("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();    }

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