日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

SpringBoot整合Quartz以及異步調用

作者:鑄鍵為犁 更新時間: 2023-07-25 編程語言

文章目錄

  • 前言
  • 一、異步方法調用
    • 1、導入依賴
    • 2、創建異步執行任務線程池
    • 3、創建業務層接口和實現類
    • 4、創建業務層接口和實現類
  • 二、測試定時任務
    • 1.導入依賴
    • 2.編寫測試類,開啟掃描定時任務
    • 3.測試
  • 三、實現定時發送郵件案例
    • 1.郵箱開啟IMAP服務
    • 2.導入依賴
    • 3.導入EmailUtil
    • 4.編寫郵件發送方法
    • 5.開啟異步和定時任務
  • 總結


前言

Quartz是一個完全由java編寫的開源作業調度框架、它的簡單易用受到業內人士的一致好評。本篇記錄怎么用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;


@Configuration
public 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;

/**
 * --效率,是成功的核心關鍵--
 *
 * @Author lzl
 * @Date 2023/3/7 09:42
 */

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;

/**
 * --效率,是成功的核心關鍵--
 *
 * @Author lzl
 * @Date 2023/3/7 09:43
 */
@Service
public 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("效率是成功的核心關鍵!");
    }
}

4、創建業務層接口和實現類

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;

/**
 * --效率,是成功的核心關鍵--
 *
 * @Author lzl
 * @Date 2023/3/7 09:40
 */
@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 "不牛逼!";
    }
}

在啟動類開啟異步
在這里插入圖片描述

整體目錄結構如下:
在這里插入圖片描述

測試:
運行項目,訪問controller

在這里插入圖片描述
訪問controller時,頁面直接出現返回值,控制臺過了兩秒打印文字,證明異步執行成功!
在這里插入圖片描述

二、測試定時任務

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;

/**
 * --效率,是成功的核心關鍵--
 *
 * @Author lzl
 * @Date 2023/3/7 10:42
 */
//任務類
@Configuration
public 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());
    }
}

在這里插入圖片描述

3.測試

在這里插入圖片描述

三、實現定時發送郵件案例

這里以QQ郵箱為例,這個功能類似于通過郵箱找回密碼類似,需要我們進行授權碼操作

1.郵箱開啟IMAP服務

登陸QQ郵箱,找到帳戶,下拉
在這里插入圖片描述
看到如下圖:
在這里插入圖片描述
我這里已經開啟了,按照步驟操作,會有一個授權碼,保存好下邊步驟要用,此處不再演示

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;
/**
 * --效率,是成功的核心關鍵--
 *
 * @Author lzl
 * @Date 2023/3/7 11:44
 */

public class EmailUtil {

    private static final String USER = "@qq.com"; // 發件人郵箱地址
    private static final String PASSWORD = ""; // qq郵箱的客戶端授權碼(需要發短信獲取)

    /**
     * @param to    收件人郵箱地址
     * @param text  郵件正文
     * @param title 標題
     */
    /* 發送驗證信息的郵件 */
    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;

/**
 * --效率,是成功的核心關鍵--
 *
 * @Author lzl
 * @Date 2023/3/7 11:45
 */
@Configuration
public 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);
    }

}

測試:
此處不再演示


總結

定時任務在很多業務場景中經常會用到,好記性不如爛筆頭,本篇只是簡單的記錄一下

原文鏈接:https://blog.csdn.net/l_zl2021/article/details/129390111

  • 上一篇:沒有了
  • 下一篇:沒有了
欄目分類
最近更新