当前位置: 首页 > news >正文

SpringBoot三种方法实现定时发送邮件的案例

前言

小编我将用CSDN记录软件开发之路上所学的心得与知识,有兴趣的小伙伴可以关注一下!也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远!让我们在成长的道路上互相学习,让我们共同进步!


目录

前言

一、发送邮件的三种方法

二、定时任务介绍

1.@EnableScheduling

2.@Scheduled

三、前期准备工作

1、登录QQ邮箱获取授权码

第一步:进入QQ邮箱

第二步:找到POP3/SMTP,并开启

第三步:复制授权码

2、pom.xml中的依赖

3、在全局配置文件application.properties添加邮件服务配置

四、操作

一、创建邮件发送任务管理的业务处理类SendEmailService

二、在test类中发送邮件

三、发送定时邮件

四、在项目启动类上添加基于注解的定时任务支持:@EnableScheduling


一、发送邮件的三种方法

1、发送纯文本邮件

2、发送复杂邮件

3、发送模板邮件

二、定时任务介绍

Spring框架的定时任务调度功能支持配置和注解两种方式Spring Boot在Spring框架的基础上实现了继承,并对其中基于注解方式的定时任务实现了非常好的支持。下面,针对 Spring Boot 项目中基于注解方式的定时任务调度的相关注解和使用进行介绍。

1.@EnableScheduling

@EnableScheduling 注解是 Spring 框架提供的,用于开启基于注解方式的定时任务支持,该注解主要用在项目启动类上。

2.@Scheduled

@Scheduled 注解同样是 Spring 框架提供的,配置定时任务的执行规则,该注解主要用在定时业务方法上。@Scheduled 注解提供有多个属性,精细化配置定时任务执行规则

属性说明
cron类似于 cron 的表达式,可以定制定时任务触发的秒、分钟、小时、月中的日、月、周中的日
zone表示在上一次任务执行结束后在指定时间后继续执行下一次任务(属性值为long类型)
fixedDelay指定cron 表达式将被解析的时区。默认情况下,该属性是空字符串(即使用服务器的本地时区
fixedDelayString表示在上一次任务执行结束后在指定时间后继续执行下一次任务(属性值为long类型的字符串形式)
fixedRate表示每隔指定时间执行一次任务 (属性值为 long 类型)
fixedRateString表示每隔指定时间执行一次任务(属性值为 long 类型的字符串形式)
initialDelay表示在fixedRate 或fixedDelay 任务第一次执行之前要延迟的毫秒数(属性值为long类型)
initialDelayString表示在fixedRate或fixedDelay 任务第一次执行之前要延迟的毫秒数(属性值为long类型的字符串形式)

三、前期准备工作

1、登录QQ邮箱获取授权码

第一步:进入QQ邮箱

第二步:找到POP3/SMTP,并开启

 

第三步:复制授权码


开启过程需要手机号码验证,按照步骤操作即可。开启成功之后,即可获取一个授权码,将该号码保存好,一会使用

 

2、pom.xml中的依赖

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></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><!--添加下面的依赖后,Spring Boot自动配置的邮件服务会生效,在邮件发送任务时,可以直接使用Spring框架提供的JavaMailSender接口或者它的实现类JavaMailSenderImpl邮件        发送--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency></dependencies>

3、在全局配置文件application.properties添加邮件服务配置

# 发件人邮件服务器相关配置
spring.mail.host=smtp.qq.com
spring.mail.port=587
# 配置个人QQ账户和密码(这里需要大家修改为自己的QQ账号和密码,密码是加密后的授权码,授权码的获得后继讲解)
spring.mail.username=QQ@qq.com
spring.mail.password=填入刚刚复制的授权码
spring.mail.default-encoding=UTF-8
# 邮件服务超时时间配置
spring.mail.properties.mail.smtp.connectiontimeout=5000
spring.mail.properties.mail.smtp.timeout=3000
spring.mail.properties.mail.smtp.writetimeout=5000

四、操作

一、创建邮件发送任务管理的业务处理类SendEmailService

注意:在方法上的注解@Async是需要搭配定时任务一起使用的,如果使用普通的test类时可以不用这个注解的

package com.lyn.service;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.MailException;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;/*** @author:Lyn.R* @date:2023-02-21 14:54:36* @Description:* @note:**/
@Service
public class SendEmailService {@Autowiredprivate JavaMailSenderImpl mailSender;//使用Spring框架提供的实现类JavaMailSenderImpl来实现邮件发送。@Value("${spring.mail.username}")//借助@Value注解读取全局变量中的spring.mail.username的值来作发件人private String from;/*** 第一种方法:发送纯文本邮件* @param to      收件人地址* @param subject 邮件标题* @param text    邮件内容*/@Asyncpublic void sendSimpleEmail(String to, String subject, String text) {// 定制纯文本邮件信息SimpleMailMessageSimpleMailMessage message = new SimpleMailMessage();message.setFrom(from);//设置发件人message.setTo(to);//设置收件人message.setSubject(subject);//设置邮件标题message.setText(text);//设置 正文件内容try {// 发送邮件mailSender.send(message);System.out.println("纯文本邮件发送成功");} catch (MailException e) {System.out.println("纯文本邮件发送失败 " + e.getMessage());e.printStackTrace();}}/*** 第二种方法:发送复杂邮件(包括静态资源和附件)* @param to           收件人地址* @param subject      邮件标题* @param text         邮件内容* @param filePath     附件地址* @param rscId        静态资源唯一标识* @param rscPath      静态资源地址*///sendComplexEmail()方法需要接收的参数除了基本的发送信息外,还包括静态资源唯一标识、静态资源路径和附件路径@Asyncpublic void sendComplexEmail(String to,String subject,String text,String filePath,String rscId,String rscPath){// 定制复杂邮件信息MimeMessageMimeMessage message = mailSender.createMimeMessage();try {// 使用MimeMessageHelper帮助类对邮件信息封装处理 ,并设置multipart多部件使用为trueMimeMessageHelper helper = new MimeMessageHelper(message, true);helper.setFrom(from);helper.setTo(to);helper.setSubject(subject);helper.setText(text, true);// 设置邮件静态资源FileSystemResource res = new FileSystemResource(new File(rscPath));helper.addInline(rscId, res);//设置邮件静态资源的方法// 设置邮件附件FileSystemResource file = new FileSystemResource(new File(filePath));String fileName = filePath.substring(filePath.lastIndexOf(File.separator));helper.addAttachment(fileName, file);//设置邮件附件的方法// 发送邮件mailSender.send(message);System.out.println("复杂邮件发送成功");} catch (MessagingException e) {System.out.println("复杂邮件发送失败 "+e.getMessage());e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}/*** 第三钟方法:发送模板邮件* @param to       收件人地址* @param subject  邮件标题* @param content  邮件内容*/@Asyncpublic void sendTemplateEmail(String to, String subject, String content) {MimeMessage message = mailSender.createMimeMessage();try {// 使用MimeMessageHelper帮助类对邮件信息进行封装处理,并设置multipart多部件使用为trueMimeMessageHelper helper = new MimeMessageHelper(message, true);helper.setFrom(from);helper.setTo(to);helper.setSubject(subject);helper.setText(content, true);// 发送邮件mailSender.send(message);System.out.println("模板邮件发送成功");} catch (MessagingException e) {System.out.println("模板邮件发送失败 "+e.getMessage());e.printStackTrace();}}}

二、在test类中发送邮件

package com.lyn;import com.lyn.service.SendEmailService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;@SpringBootTest
class SpringbootHomeworkEmail0221ApplicationTests {@Autowiredprivate SendEmailService sendEmailService;@Testpublic void sendSimpleMailTest() {String to="12345678@qq.com";//这里修改为你能接收到的邮箱String subject="【纯文本邮件】标题";String text="嘟嘟嘟.....";// 发送简单邮件sendEmailService.sendSimpleEmail(to,subject,text);}@Testpublic void sendComplexEmailTest() {//根据前面定义的复杂邮件发送业务定制各种参数String to="12345678@qq.com";//修改为你自己的邮件方便接收查看String subject="【复杂邮件】标题";// 定义邮件内容StringBuilder text = new StringBuilder();//对邮件内容使用了HTML标签编辑邮件内容text.append("<html><head></head>");text.append("<body><h1>二月二龙抬头!</h1>");// cid为嵌入静态资源文件关键字的固定写法,如果改变将无法识别;rscId则属于自定义的静态资源唯一标识,一个邮件内容中可能会包括多个静态资源,该属性是为了区别唯一性的。String rscId = "img001";text.append("<img src='cid:" +rscId+"'/></body>");text.append("</html>");// 指定静态资源文件和附件路径String rscPath="D:\\1.jpg";//注意这里修改为你的硬盘中有的资源String filePath="D:\\hahaha.txt";//注意这里修改为你的硬盘中有的资源// 发送复杂邮件sendEmailService.sendComplexEmail(to,subject,text.toString(),filePath,rscId,rscPath);}@Autowiredprivate TemplateEngine templateEngine;@Testpublic void sendTemplateEmailTest() {String to="12345678@qq.com";String subject="【模板邮件】标题";// 使用模板邮件定制邮件正文内容Context context = new Context();//Context注意正确导入“import org.thymeleaf.context.Context;”context.setVariable("username", "石头");context.setVariable("code", "456123");// 使用TemplateEngine设置要处理的模板页面String emailContent = templateEngine.process("emailTemplate_vercode", context);// 发送模板邮件sendEmailService.sendTemplateEmail(to,subject,emailContent);}
}

模板文件的html(emailTemplate_vercode.html)

<!DOCTYPE html>
<html lang="en">
<html lang="zh" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"/><title>用户验证码</title>
</head>
<body>
<div><span th:text="${username}">XXX</span>&nbsp;先生/女士,您好:</div>
<P style="text-indent: 2em">您的新用户验证码为<span th:text="${code}" style="color: cornflowerblue">123456</span>,请妥善保管。</P>
</body>
</html>

三、发送定时邮件

下面类中的 @Scheduled(cron = "*/5 * * * * ?")表达式大家可以去下面的网址生成Cron - 在线Cron表达式生成器 (ciding.cc)

package com.lyn.controller;import com.lyn.service.SendEmailService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Service;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;/*** @author:Lyn.R* @date:2023-02-21 19:55:01* @Description:* @note:**/
@Controller
public class MyScheduled {@Autowiredprivate SendEmailService sendEmailService;@Autowired//模板引擎(Template Engine), 是用来解析对应类型模板文件然后动态生成由数据和静态页面组成的视图文件的一个工具private TemplateEngine templateEngine;@Scheduled(cron = "*/5 * * * * ?")public void sendSimpleMailTest() {String to="12345678@qq.com";//这里修改为你能接收到的邮箱String subject="【纯文本邮件】标题";String text="嘟嘟嘟.....";// 发送简单邮件sendEmailService.sendSimpleEmail(to,subject,text);}@Scheduled(cron = "1 * * * * ?  ")public void sendComplexEmailTest() {//根据前面定义的复杂邮件发送业务定制各种参数String to="12345678@qq.com";//修改为你自己的邮件方便接收查看String subject="【复杂邮件】标题";// 定义邮件内容StringBuilder text = new StringBuilder();//对邮件内容使用了HTML标签编辑邮件内容text.append("<html><head></head>");text.append("<body><h1>二月二龙抬头!</h1>");// cid为嵌入静态资源文件关键字的固定写法,如果改变将无法识别;rscId则属于自定义的静态资源唯一标识,一个邮件内容中可能会包括多个静态资源,该属性是为了区别唯一性的。String rscId = "img001";text.append("<img src='cid:" +rscId+"'/></body>");text.append("</html>");// 指定静态资源文件和附件路径String rscPath="D:\\1.jpg";//注意这里修改为你的硬盘中有的资源String filePath="D:\\hahaha.txt";//注意这里修改为你的硬盘中有的资源// 发送复杂邮件sendEmailService.sendComplexEmail(to,subject,text.toString(),filePath,rscId,rscPath);}@Scheduled(cron = "0 * * * * ? ")public void sendTemplateEmailTest() {String to="12345678@qq.com";String subject="【模板邮件】标题";// 使用模板邮件定制邮件正文内容Context context = new Context();//Context注意正确导入“import org.thymeleaf.context.Context;”context.setVariable("username", "石头");context.setVariable("code", "456123");// 使用TemplateEngine设置要处理的模板页面String emailContent = templateEngine.process("emailTemplate_vercode", context);// 发送模板邮件sendEmailService.sendTemplateEmail(to,subject,emailContent);}
}

四、在项目启动类上添加基于注解的定时任务支持:@EnableScheduling

package com.lyn;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;@SpringBootApplication
@EnableScheduling
public class SpringbootHomeworkEmail0221Application {public static void main(String[] args) {SpringApplication.run(SpringbootHomeworkEmail0221Application.class, args);}}

注意:邮件发多了,可能会导致qq邮箱认为是垃圾邮件,就会出现报错,所以尽量不要进行邮箱轰炸

以上就是小编的实现过程,希望各位大佬可以多多指教,共同进步!!!

相关文章:

SpringBoot三种方法实现定时发送邮件的案例

前言 小编我将用CSDN记录软件开发之路上所学的心得与知识&#xff0c;有兴趣的小伙伴可以关注一下&#xff01;也许一个人独行&#xff0c;可以走的很快&#xff0c;但是一群人结伴而行&#xff0c;才能走的更远&#xff01;让我们在成长的道路上互相学习&#xff0c;让我们共…...

opengl、opengl es、webgl介绍与opengl开发入门

1、OpenGL OpenGL&#xff08;英语&#xff1a;Open Graphics Library&#xff0c;译名&#xff1a;开放图形库或者“开放式图形库”&#xff09;常用于CAD、虚拟现实、科学可视化程序和电子游戏开发。OpenGL的高效实现&#xff08;利用了图形加速硬件&#xff09;存在于Windo…...

Vue3之组件间传值

何为组件间传值 在Vue3之组件文章中&#xff0c;我们学会了定义使用组件&#xff0c;但是我们似乎还缺少什么将组件之间联系起来&#xff0c;说到组件之间的联系就不得不提组件间的传值&#xff0c;而组件间的传值其实也不难理解&#xff0c;就是如何在子组件中接收到父组件传…...

Windows10下使用CMake编译ITK5.2.1步骤

编译环境&#xff1a;Windows10VS2017Cmak3.24.0ITK5.2.1 编译步骤&#xff1a; 1、下载ITK到本地&#xff1a;ITK官网Download | ITK&#xff0c;ITK5.2.1下载地址 https://github.com/InsightSoftwareConsortium/ITK/releases/download/v5.2.1/InsightToolkit-5.2.1.zip ​…...

字符串模式匹配,经典KMP算法你还不会?我可不允许你不会!

文章目录重点1. 简单模式匹配算法2. 部分匹配值PM的算法&#xff08;Move j-1 PM[j-1]&#xff09;3. 部分匹配值PM的两次改进&#xff08;Move j-next[j]&#xff09;4. 快速得到next数组5. KMP匹配算法重点 童鞋们看网上讲解的时候一定要分清楚序列是从0开始还是从1开始&…...

C++操作redis(实现连接池、分布式锁)

文章目录Redis连接池编译项目整体架构使用分布式锁总结Redis连接池 封装hiredis的一些基本操作&#xff0c;redishelper类提供包含连接&#xff0c;放回&#xff0c;存取键&#xff0c;push&#xff0c;pop&#xff0c;执行redis语句和执行lua脚本的函数&#xff0c;连接池是类…...

硬件基础专题-01电阻篇

目录 课程链接 学习目的 电阻 电阻理论讲解 电阻定义​ 欧姆定律​ 电阻单位换算 电阻选型考虑 安装方式 常见电阻值 各种贴片电阻的读取方式 确定电阻值的方法 电阻数据手册 电阻测量 电阻的产品应用​ 零欧姆电阻 热敏电阻 光敏电阻 课程链接 视频专辑 - 硬件…...

【JAVA程序设计】(C00112)基于Springboot+Thymeleaf的在线购物商城——有文档

基于SpringbootThymeleaf的在线购物商城——有文档项目简介项目获取开发环境项目技术运行截图运行视频项目简介 基于Springbootthymeleaf框架的在线购物商城系统&#xff0c;本系统共分为二个角色&#xff1a;管理员和用户 管理员角色包含以下功能&#xff1a; 商品管理、商品…...

shell基础(5)算数计算:运算语法、自增自减

文章目录1. shell算数运算的特点2. 运算符一览3. 运算语法3.1 整形运算3.2. 小数运算 ing4. 自增自减4.1. a与a4.2. 自加1. shell算数运算的特点 Shell 和其它编程语言不同&#xff0c;Shell 不能直接进行算数运算&#xff0c;必须使用数学计算命令。Shell只支持整数运算&#…...

virtio设备input节点

注册virtio_input_node节点&#xff0c;节点类型为VLIB_NODE_TYPE_INPUT。 VLIB_REGISTER_NODE (virtio_input_node) {.name "virtio-input",.sibling_of "device-input",.format_trace format_virtio_input_trace,.flags VLIB_NODE_FLAG_TRACE_SUPP…...

《计算机网络:自顶向下方法》学习笔记——第一章:计算机网络和因特网

计网 第一章 计算机网络和因特网 1.1 什么是因特网 回答这个问题有两种方式 其一&#xff0c;我们能够描述因特网的具体构成&#xff0c;即构成因特网的基本硬件和软件组件&#xff1b;其二&#xff0c;我们能够根据为分布式应用提供服务的联网基础设施来描述因特网。 1.1.…...

PDF 解析格式化输出 API 数据接口

PDF 解析格式化输出 API 数据接口 支持输出 TEXT HTML XML TAG&#xff0c;多种格式输出&#xff0c;超精准识别率。 1. 产品功能 通用的识别接口&#xff0c; 支持标准 PDF 文件解析&#xff1b;多种格式输出&#xff0c;支持 TEXT HTML XML TAG&#xff1b;HTML 包含完美排…...

RL笔记:基于策略迭代求CliffWaking-v0最优解(python实现)

目录 1. 概要 2. 实现 3. 运行结果 1. 概要 CliffWalking-v0是gym库中的一个例子[1]&#xff0c;是从Sutton-RLbook-2020的Example6.6改编而来。不过本文不是关于gym中的CliffWalking-v0如何玩的&#xff0c;而是关于基于策略迭代求该问题最优解的实现例。 CliffWalking-v0的…...

350. 两个数组的交集 II

两个数组的交集 II 给你两个整数数组 nums1 和 nums2 &#xff0c;请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数&#xff0c;应与元素在两个数组中都出现的次数一致&#xff08;如果出现次数不一致&#xff0c;则考虑取较小值&#xff09;。可以不考虑输出结…...

Android仿微信选择图片

效果展示首先先添加用到的权限<uses-permission android:name"android.permission.INTERNET" /><!--获取手机存储卡权限--><uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE"/><uses-permission android:nam…...

python+嵌入式——串口通信篇(收发解包)

目录前言安装pyserialpyserial大致概括整体流程硬件连接例子(简单版)详细使用serial初始化参数发包收包收包检查包并解包python struct模块结语前言 这几年&#xff0c;自己也做了一些嵌入式机器人。在整个开发的过程中&#xff0c;调通信通常会花费一段比较长的时间&#xff…...

剖析G1 垃圾回收器

简单回顾 在Java当中&#xff0c;程序员在编写代码的时候只需要创建对象&#xff0c;从来不需要考虑将对象进行释放&#xff0c;这是因为Java中对象的垃圾回收全部由JVM替你完成了(所有的岁月静好都不过是有人替你负重前行)。 而JVM的垃圾回收由垃圾回收器来负责&#xff0c;在…...

如何打造一款专属于自己的高逼格电脑桌面

作为一名电脑重度使用者&#xff0c;你是否拥有一款属于你自己的高逼格电脑桌面呢&#xff1f;你是不是也像大多数同学一样&#xff0c;会把所有的内容全部都堆积到电脑桌面&#xff0c;不仅找东西困难&#xff0c;由于桌面内容太多还会导致C盘空间不足&#xff0c;影响电脑的反…...

【C++】string的使用及其模拟实现

文章目录1. STL的介绍1.1 STL的六大组件1.2 STL的版本1.3 STL的缺陷2. string的使用2.1 为什么要学习string类&#xff1f;2.2 常见构造2.3 Iterator迭代器2.4 Capacity2.5 Modifiers2.6 String operations3. string的模拟实现3.1 构造函数3.2 拷贝构造函数3.3 赋值运算符重载和…...

怀念在青鸟的日子

时间过的可真快&#xff0c;一转眼来到了2023年&#xff01;我初中上完就没有在念&#xff0c;下了学门步入社会&#xff0c;那时的我一片迷茫&#xff0c;不知道该去干什 么&#xff0c;父母说要不去学挖掘机、理发、修车...我思考再三&#xff0c;一个都没有我喜欢的&#xf…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...