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

免费教程   2024年05月09日 14:43  

这篇文章主要介绍“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自带的线程池

packagecom.lzl.config;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.scheduling.annotation.AsyncConfigurer;importorg.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;importjava.util.concurrent.Executor;@ConfigurationpublicclassAsyncExcutorPoolConfigimplementsAsyncConfigurer{@Bean("asyncExecutor")@OverridepublicExecutorgetAsyncExecutor(){//Spring自带的线程池(最常用)ThreadPoolTaskExecutortaskExecutor=newThreadPoolTaskExecutor();//线程:IO密集型和CPU密集型//线程设置参数taskExecutor.setCorePoolSize(8);//核心线程数,根据电脑的核数taskExecutor.setMaxPoolSize(16);//最大线程数一般为核心线程数的2倍taskExecutor.setWaitForTasksToCompleteOnShutdown(true);//任务执行完成后关闭returntaskExecutor;}}

注意注解不要少

3、创建业务层接口和实现类packagecom.lzl.Service;/***--效率,是成功的核心关键--**@Authorlzl*@Date2023/3/709:42*/publicinterfaceAsyncService{voidtestAsync1();voidtestAsync2();}packagecom.lzl.Service.impl;importcom.lzl.Service.AsyncService;importorg.springframework.scheduling.annotation.Async;importorg.springframework.stereotype.Service;/***--效率,是成功的核心关键--**@Authorlzl*@Date2023/3/709:43*/@ServicepublicclassAsyncImplimplementsAsyncService{@Async@OverridepublicvoidtestAsync1(){try{Thread.sleep(3000);}catch(InterruptedExceptione){e.printStackTrace();}System.out.println("精准是唯一重要的标准!");}@Async("asyncExecutor")//开启异步执行@OverridepublicvoidtestAsync2(){try{Thread.sleep(3000);}catch(InterruptedExceptione){e.printStackTrace();}System.out.println("效率是成功的核心关键!");}}

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

packagecom.lzl.task;importcom.lzl.Service.AsyncService;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;/***--效率,是成功的核心关键--**@Authorlzl*@Date2023/3/709:40*/@RestController@RequestMapping("/login")publicclassLoginController{@AutowiredprivateAsyncServiceservice;@RequestMapping("/Async1")publicStringtestAsync1(){service.testAsync1();return"牛逼!";}@RequestMapping("/Async2")publicStringtestAsync2(){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.编写测试类,开启扫描定时任务packagecom.lzl.task;importorg.springframework.context.annotation.Configuration;importorg.springframework.scheduling.annotation.Async;importorg.springframework.scheduling.annotation.Scheduled;importjava.util.Date;/***--效率,是成功的核心关键--**@Authorlzl*@Date2023/3/710:42*///任务类@ConfigurationpublicclassTasks{@Async@Scheduled(cron="*/2****?")publicvoidtask1(){System.out.println("效率"+newDate().toLocaleString());}@Async@Scheduled(cron="*/1****?")publicvoidtask2(){System.out.println("精准"+newDate().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.导入EmailUtilpackagecom.lzl.utils;importjavax.mail.*;importjavax.mail.internet.InternetAddress;importjavax.mail.internet.MimeMessage;importjava.util.Properties;importjava.util.Random;/***--效率,是成功的核心关键--**@Authorlzl*@Date2023/3/711:44*/publicclassEmailUtil{privatestaticfinalStringUSER="@qq.com";//发件人邮箱地址privatestaticfinalStringPASSWORD="";//qq邮箱的客户端授权码(需要发短信获取)/***@paramto收件人邮箱地址*@paramtext邮件正文*@paramtitle*//*发送验证信息的邮件*/publicstaticbooleansendMail(Stringto,Stringtext,Stringtitle){try{finalPropertiesprops=newProperties();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进行身份验证Authenticatorauthenticator=newAuthenticator(){@OverrideprotectedPasswordAuthenticationgetPasswordAuthentication(){//用户名、密码StringuserName=props.getProperty("mail.user");Stringpassword=props.getProperty("mail.password");returnnewPasswordAuthentication(userName,password);}};//使用环境属性和授权信息,创建邮件会话SessionmailSession=Session.getInstance(props,authenticator);//创建邮件消息MimeMessagemessage=newMimeMessage(mailSession);//设置发件人Stringusername=props.getProperty("mail.user");InternetAddressform=newInternetAddress(username);message.setFrom(form);//设置收件人InternetAddresstoAddress=newInternetAddress(to);message.setRecipient(Message.RecipientType.TO,toAddress);//设置邮件message.setSubject(title);//设置邮件的内容体message.setContent(text,"text/html;charset=UTF-8");//发送邮件Transport.send(message);returntrue;}catch(Exceptione){e.printStackTrace();}returnfalse;}//随机生成num个数字验证码publicstaticStringgetValidateCode(intnum){Randomrandom=newRandom();StringvalidateCode="";for(inti=0;i<num;i++){//0-9之间随机生成num次intresult=random.nextInt(10);validateCode+=result;}returnvalidateCode;}//测试publicstaticvoidmain(String[]args)throwsException{//给指定邮箱发送邮件EmailUtil.sendMail("729953102@qq.com","你好,这是一封测试邮件,无需回复。","测试邮件随机生成的验证码是:"+getValidateCode(6));System.out.println("发送成功");}}4.编写邮件发送方法packagecom.lzl.task;importcom.lzl.utils.EmailUtil;importorg.springframework.context.annotation.Configuration;importorg.springframework.scheduling.annotation.Scheduled;/***--效率,是成功的核心关键--**@Authorlzl*@Date2023/3/711:45*/@ConfigurationpublicclassTaskEmail{//指定时间进行发送邮件@Scheduled(cron="104911**?")publicvoidsendMail(){EmailUtil.sendMail("自己的邮箱@qq.com","效率,是成功的核心关键!","测试邮件随机生成的验证码是:"+EmailUtil.getValidateCode(6));}}5.开启异步和定时任务packagecom.lzl;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.scheduling.annotation.EnableAsync;importorg.springframework.scheduling.annotation.EnableScheduling;@SpringBootApplication@EnableAsync//开启异步@EnableScheduling//开启定时任务publicclassQuartzStudyApplication{publicstaticvoidmain(String[]args){SpringApplication.run(QuartzStudyApplication.class,args);}}

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

域名注册
购买VPS主机

您或许对下面这些文章有兴趣:                    本月吐槽辛苦排行榜

看贴要回贴有N种理由!看帖不回贴的后果你懂得的!


评论内容 (*必填):
(Ctrl + Enter提交)   

部落快速搜索栏

各类专题梳理

网站导航栏

X
返回顶部