網站首頁 編程語言 正文
文章目錄
- 前言
- 一、異步方法調用
- 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
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2022-09-29 關于React動態修改元素樣式的三種方式_React
- 2022-02-12 android button的圓角邊框及點擊效果實現
- 2022-03-24 C++數組和指針的區別與聯系_C 語言
- 2022-12-24 python項目運行導致內存越來越大的原因詳析_python
- 2022-11-04 C++與QML進行數據交互實現方式介紹_C 語言
- 2022-01-28 Mybatis技術內幕-設計模式與應用場景總結
- 2021-12-07 Linux系統的修復模式(單用戶模式)_Linux
- 2023-10-26 video標簽未自動播放,autoplay無效,video不能自動播放的原因分析
- 欄目分類
-
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支