网站群建设 公司,企查查企业信息查询在线,公司注册网站有安全风险怎么注销,国外有哪些优秀的网站文章目录前言一、异步方法调用1、导入依赖2、创建异步执行任务线程池3、创建业务层接口和实现类4、创建业务层接口和实现类二、测试定时任务1.导入依赖2.编写测试类#xff0c;开启扫描定时任务3.测试三、实现定时发送邮件案例1.邮箱开启IMAP服务2.导入依赖3.导入EmailUtil4.编…
文章目录前言一、异步方法调用1、导入依赖2、创建异步执行任务线程池3、创建业务层接口和实现类4、创建业务层接口和实现类二、测试定时任务1.导入依赖2.编写测试类开启扫描定时任务3.测试三、实现定时发送邮件案例1.邮箱开启IMAP服务2.导入依赖3.导入EmailUtil4.编写邮件发送方法5.开启异步和定时任务总结前言
Quartz是一个完全由java编写的开源作业调度框架、它的简单易用受到业内人士的一致好评。本篇记录怎么用SpringBoot使用Quartz 一、异步方法调用 由于多个任务同时执行时默认为单线程所以我们用异步方法调用使其成为多线程执行 看一个案例
1、导入依赖 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-devtools/artifactIdscoperuntime/scopeoptionaltrue/optional/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-configuration-processor/artifactIdoptionaltrue/optional/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency2、创建异步执行任务线程池 这里我们使用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)Overridepublic 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 {AsyncOverridepublic void testAsync1() {try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(精准是唯一重要的标准);}Async(asyncExecutor)//开启异步执行Overridepublic 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 {Autowiredprivate AsyncService service;RequestMapping(/Async1)public String testAsync1(){service.testAsync1();return 牛逼;}RequestMapping(/Async2)public String testAsync2(){service.testAsync2();return 不牛逼;}
}
在启动类开启异步
整体目录结构如下
测试 运行项目访问controller 访问controller时页面直接出现返回值控制台过了两秒打印文字证明异步执行成功
二、测试定时任务
1.导入依赖 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-devtools/artifactIdscoperuntime/scopeoptionaltrue/optional/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-configuration-processor/artifactIdoptionaltrue/optional/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency2.编写测试类开启扫描定时任务
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 {AsyncScheduled(cron */2 * * * * ?)public void task1(){System.out.println(效率new Date().toLocaleString());}AsyncScheduled(cron */1 * * * * ?)public void task2(){System.out.println(精准new Date().toLocaleString());}
} 3.测试 三、实现定时发送邮件案例 这里以QQ邮箱为例这个功能类似于通过邮箱找回密码类似需要我们进行授权码操作 1.邮箱开启IMAP服务
登陆QQ邮箱找到帐户下拉 看到如下图 我这里已经开启了按照步骤操作会有一个授权码保存好下边步骤要用此处不再演示
2.导入依赖 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!-- 邮箱 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-mail/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-devtools/artifactIdscoperuntime/scopeoptionaltrue/optional/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-configuration-processor/artifactIdoptionaltrue/optional/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency3.导入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() {Overrideprotected 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;charsetUTF-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(729953102qq.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);}}
测试 此处不再演示 总结
定时任务在很多业务场景中经常会用到好记性不如烂笔头本篇只是简单的记录一下