文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

SpringBoot整合Quartz及异步调用的方法是什么

2023-07-05 11:16

关注

这篇文章主要介绍“SpringBoot整合Quartz及异步调用的方法是什么”,在日常操作中,相信很多人在SpringBoot整合Quartz及异步调用的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”SpringBoot整合Quartz及异步调用的方法是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

一、异步方法调用

由于多个任务同时执行时,默认为单线程,所以我们用异步方法调用,使其成为多线程执行

看一个案例

1、导入依赖

 <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-devtools</artifactId>            <scope>runtime</scope>            <optional>true</optional>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-configuration-processor</artifactId>            <optional>true</optional>        </dependency>        <dependency>            <groupId>org.projectlombok</groupId>            <artifactId>lombok</artifactId>            <optional>true</optional>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-test</artifactId>            <scope>test</scope>        </dependency>

2、创建异步执行任务线程池

这里我们使用springboot自带的线程池

package com.lzl.config;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.scheduling.annotation.AsyncConfigurer;import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import java.util.concurrent.Executor;@Configurationpublic class AsyncExcutorPoolConfig implements AsyncConfigurer {    @Bean("asyncExecutor")    @Override    public Executor getAsyncExecutor() {        //Spring自带的线程池(最常用)        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();        //线程:IO密集型 和 CPU密集型        //线程设置参数        taskExecutor.setCorePoolSize(8);//核心线程数,根据电脑的核数        taskExecutor.setMaxPoolSize(16);//最大线程数一般为核心线程数的2倍        taskExecutor.setWaitForTasksToCompleteOnShutdown(true);//任务执行完成后关闭        return taskExecutor;    }}

注意注解不要少

3、创建业务层接口和实现类

package com.lzl.Service;public interface AsyncService {    void testAsync1();    void testAsync2();}
package com.lzl.Service.impl;import com.lzl.Service.AsyncService;import org.springframework.scheduling.annotation.Async;import org.springframework.stereotype.Service;@Servicepublic class AsyncImpl implements AsyncService {    @Async    @Override    public void testAsync1() {        try {            Thread.sleep(3000);        } catch (InterruptedException e) {            e.printStackTrace();        }        System.out.println("精准是唯一重要的标准!");    }    @Async("asyncExecutor")//开启异步执行    @Override    public void testAsync2() {        try {            Thread.sleep(3000);        } catch (InterruptedException e) {            e.printStackTrace();        }        System.out.println("效率是成功的核心关键!");    }}

创建业务层接口和实现类

package com.lzl.task;import com.lzl.Service.AsyncService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestController@RequestMapping("/login")public class LoginController {    @Autowired    private AsyncService service;    @RequestMapping("/Async1")    public String testAsync1(){        service.testAsync1();        return "牛逼!";    }    @RequestMapping("/Async2")    public String testAsync2(){        service.testAsync2();        return "不牛逼!";    }}

在启动类开启异步

SpringBoot整合Quartz及异步调用的方法是什么

整体目录结构如下:

SpringBoot整合Quartz及异步调用的方法是什么

测试:
运行项目,访问controller

SpringBoot整合Quartz及异步调用的方法是什么

访问controller时,页面直接出现返回值,控制台过了两秒打印文字,证明异步执行成功!

SpringBoot整合Quartz及异步调用的方法是什么

二、测试定时任务

1.导入依赖

<dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-devtools</artifactId>            <scope>runtime</scope>            <optional>true</optional>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-configuration-processor</artifactId>            <optional>true</optional>        </dependency>        <dependency>            <groupId>org.projectlombok</groupId>            <artifactId>lombok</artifactId>            <optional>true</optional>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-test</artifactId>            <scope>test</scope>        </dependency>

2.编写测试类,开启扫描定时任务

package com.lzl.task;import org.springframework.context.annotation.Configuration;import org.springframework.scheduling.annotation.Async;import org.springframework.scheduling.annotation.Scheduled;import java.util.Date;//任务类@Configurationpublic class Tasks {    @Async    @Scheduled(cron = "*/2 * * * * ?")    public void task1(){        System.out.println("效率"+new Date().toLocaleString());    }    @Async    @Scheduled(cron = "*/1 * * * * ?")    public void task2(){        System.out.println("精准"+new Date().toLocaleString());    }}

SpringBoot整合Quartz及异步调用的方法是什么

3.测试

SpringBoot整合Quartz及异步调用的方法是什么

三、实现定时发送邮件案例

这里以QQ邮箱为例,这个功能类似于通过邮箱找回密码类似,需要我们进行授权码操作

1.邮箱开启IMAP服务

登陆QQ邮箱,找到帐户,下拉

看到如下图:

SpringBoot整合Quartz及异步调用的方法是什么

我这里已经开启了,按照步骤操作,会有一个授权码,保存好下边步骤要用,此处不再演示

2.导入依赖

<dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency>        <!-- 邮箱 -->        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-mail</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-devtools</artifactId>            <scope>runtime</scope>            <optional>true</optional>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-configuration-processor</artifactId>            <optional>true</optional>        </dependency>        <dependency>            <groupId>org.projectlombok</groupId>            <artifactId>lombok</artifactId>            <optional>true</optional>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-test</artifactId>            <scope>test</scope>        </dependency>

3.导入EmailUtil

package com.lzl.utils;import javax.mail.*;import javax.mail.internet.InternetAddress;import javax.mail.internet.MimeMessage;import java.util.Properties;import java.util.Random;public class EmailUtil {    private static final String USER = "@qq.com"; // 发件人邮箱地址    private static final String PASSWORD = ""; // qq邮箱的客户端授权码(需要发短信获取)            public static boolean sendMail(String to, String text, String title) {        try {            final Properties props = new Properties();            props.put("mail.smtp.auth", "true");            props.put("mail.smtp.host", "smtp.qq.com");            // 发件人的账号            props.put("mail.user", USER);            //发件人的密码            props.put("mail.password", PASSWORD);            // 构建授权信息,用于进行SMTP进行身份验证            Authenticator authenticator = new Authenticator() {                @Override                protected PasswordAuthentication getPasswordAuthentication() {                    // 用户名、密码                    String userName = props.getProperty("mail.user");                    String password = props.getProperty("mail.password");                    return new PasswordAuthentication(userName, password);                }            };            // 使用环境属性和授权信息,创建邮件会话            Session mailSession = Session.getInstance(props, authenticator);            // 创建邮件消息            MimeMessage message = new MimeMessage(mailSession);            // 设置发件人            String username = props.getProperty("mail.user");            InternetAddress form = new InternetAddress(username);            message.setFrom(form);            // 设置收件人            InternetAddress toAddress = new InternetAddress(to);            message.setRecipient(Message.RecipientType.TO, toAddress);            // 设置邮件            message.setSubject(title);            // 设置邮件的内容体            message.setContent(text, "text/html;charset=UTF-8");            // 发送邮件            Transport.send(message);            return true;        } catch (Exception e) {            e.printStackTrace();        }        return false;    }    //随机生成num个数字验证码    public static String getValidateCode(int num) {        Random random = new Random();        String validateCode = "";        for (int i = 0; i < num; i++) {            //0 - 9 之间 随机生成 num 次            int result = random.nextInt(10);            validateCode += result;        }        return validateCode;    }    //测试    public static void main(String[] args) throws Exception {        //给指定邮箱发送邮件        EmailUtil.sendMail("729953102@qq.com", "你好,这是一封测试邮件,无需回复。", "测试邮件随机生成的验证码是:" + getValidateCode(6));        System.out.println("发送成功");    }}

4.编写邮件发送方法

package com.lzl.task;import com.lzl.utils.EmailUtil;import org.springframework.context.annotation.Configuration;import org.springframework.scheduling.annotation.Scheduled;@Configurationpublic class TaskEmail {    //指定时间进行发送邮件    @Scheduled(cron = "10 49 11 * * ?")    public void sendMail(){        EmailUtil.sendMail("自己的邮箱@qq.com", "效率,是成功的核心关键!", "测试邮件随机生成的验证码是:" + EmailUtil.getValidateCode(6));    }}

5.开启异步和定时任务

package com.lzl;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.scheduling.annotation.EnableAsync;import org.springframework.scheduling.annotation.EnableScheduling;@SpringBootApplication@EnableAsync//开启异步@EnableScheduling//开启定时任务public class QuartzStudyApplication {    public static void main(String[] args) {        SpringApplication.run(QuartzStudyApplication.class, args);    }}

到此,关于“SpringBoot整合Quartz及异步调用的方法是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯