flask-mail异步发送邮件_异步、定时、邮件任务
十、异步、定时、邮件任务
1.异步任务
1、创建一个service包
2、创建一个类AsyncService
异步处理还是非常常用的,比如我们在网站上发送邮件,后台会去发送邮件,此时前台会造成响应不动,直到邮件发送完毕,响应才会成功,所以我们一般会采用多线程的方式去处理这些任务。
编写方法,假装正在处理数据,使用线程设置一些延时,模拟同步等待的情况;
@Servicepublic class AsyncService { public void hello(){ try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("业务进行中...."); }}
3、编写controller包
4、编写AsyncController类
我们去写一个Controller测试一下
@RestControllerpublic class AsyncController { @Autowired AsyncService asyncService; @GetMapping("/hello") public String hello(){ asyncService.hello(); return "success"; }}
5、访问http://localhost:8080/hello进行测试,3秒后出现success,这是同步等待的情况。
问题:我们如果想让用户直接得到消息,就在后台使用多线程的方式进行处理即可,但是每次都需要自己手动去编写多线程的实现的话,太麻烦了,我们只需要用一个简单的办法,在我们的方法上加一个简单的注解即可,如下:
6、给hello方法添加@Async注解;
//告诉Spring这是一个异步方法@Asyncpublic void hello(){ try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("业务进行中....");}
SpringBoot就会自己开一个线程池,进行调用!但是要让这个注解生效,我们还需要在主程序上添加一个注解@EnableAsync ,开启异步注解功能;
@EnableAsync //开启异步注解功能@SpringBootApplicationpublic class SpringbootTaskApplication { public static void main(String[] args) { SpringApplication.run(SpringbootTaskApplication.class, args); }}
7、重启测试,网页瞬间响应,后台代码依旧执行!
2.定时任务
项目开发中经常需要执行一些定时任务,比如需要在每天凌晨的时候,分析一次前一天的日志信息,Spring为我们提供了异步执行任务调度的方式,提供了两个接口。
TaskExecutor接口
TaskScheduler接口
两个注解:
@EnableScheduling
@Scheduled
cron表达式:
测试步骤:
1、创建一个ScheduledService
我们里面存在一个hello方法,他需要定时执行,怎么处理呢?
@Servicepublic class ScheduledService { //秒 分 时 日 月 周几 //0 * * * * MON-FRI //注意cron表达式的用法; @Scheduled(cron = "0 * * * * 0-7") public void hello(){ System.out.println("hello....."); }}
2、这里写完定时任务之后,我们需要在主程序上增加@EnableScheduling 开启定时任务功能
@EnableAsync //开启异步注解功能@EnableScheduling //开启基于注解的定时任务@SpringBootApplicationpublic class SpringbootTaskApplication { public static void main(String[] args) { SpringApplication.run(SpringbootTaskApplication.class, args); }}
3、我们来详细了解下cron表达式;
http://www.bejson.com/othertools/cron/
4、常用的表达式
(1)0/2 * * * * ? 表示每2秒 执行任务(1)0 0/2 * * * ? 表示每2分钟 执行任务(1)0 0 2 1 * ? 表示在每月的1日的凌晨2点调整任务(2)0 15 10 ? * MON-FRI 表示周一到周五每天上午10:15执行作业(3)0 15 10 ? 6L 2002-2006 表示2002-2006年的每个月的最后一个星期五上午10:15执行作(4)0 0 10,14,16 * * ? 每天上午10点,下午2点,4点(5)0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时(6)0 0 12 ? * WED 表示每个星期三中午12点(7)0 0 12 * * ? 每天中午12点触发(8)0 15 10 ? * * 每天上午10:15触发(9)0 15 10 * * ? 每天上午10:15触发(10)0 15 10 * * ? 每天上午10:15触发(11)0 15 10 * * ? 2005 2005年的每天上午10:15触发(12)0 * 14 * * ? 在每天下午2点到下午2:59期间的每1分钟触发(13)0 0/5 14 * * ? 在每天下午2点到下午2:55期间的每5分钟触发(14)0 0/5 14,18 * * ? 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发(15)0 0-5 14 * * ? 在每天下午2点到下午2:05期间的每1分钟触发(16)0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44触发(17)0 15 10 ? * MON-FRI 周一至周五的上午10:15触发(18)0 15 10 15 * ? 每月15日上午10:15触发(19)0 15 10 L * ? 每月最后一日的上午10:15触发(20)0 15 10 ? * 6L 每月的最后一个星期五上午10:15触发(21)0 15 10 ? * 6L 2002-2005 2002年至2005年的每月的最后一个星期五上午10:15触发(22)0 15 10 ? * 6#3 每月的第三个星期五上午10:15触发
3.邮件任务
邮件发送,在我们的日常开发中,也非常的多,Springboot也帮我们做了支持
邮件发送需要引入spring-boot-start-mail
SpringBoot 自动配置MailSenderAutoConfiguration
定义MailProperties内容,配置在application.yml中
自动装配JavaMailSender
测试邮件发送
测试:
1、引入pom依赖
<dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-mailartifactId>dependency>
看它引入的依赖,可以看到 jakarta.mail
<dependency> <groupId>com.sun.mailgroupId> <artifactId>jakarta.mailartifactId> <version>1.6.4version> <scope>compilescope>dependency>
2、查看自动配置类:MailSenderAutoConfiguration
这个类中存在bean,JavaMailSenderImpl
然后我们去看下配置文件
@ConfigurationProperties( prefix = "spring.mail")public class MailProperties { private static final Charset DEFAULT_CHARSET; private String host; private Integer port; private String username; private String password; private String protocol = "smtp"; private Charset defaultEncoding; private Map<String, String> properties; private String jndiName;}
3、配置文件:
spring.mail.username=24736743@qq.comspring.mail.password=你的qq授权码spring.mail.host=smtp.qq.com# qq需要配置sslspring.mail.properties.mail.smtp.ssl.enable=true
获取授权码:在QQ邮箱中的设置->账户->开启pop3和smtp服务
4、Spring单元测试
@AutowiredJavaMailSenderImpl mailSender;@Testpublic void contextLoads() { //邮件设置1:一个简单的邮件 SimpleMailMessage message = new SimpleMailMessage(); message.setSubject("通知-明天来狂神这听课"); message.setText("今晚7:30开会"); message.setTo("24736743@qq.com"); message.setFrom("24736743@qq.com"); mailSender.send(message);}@Testpublic void contextLoads2() throws MessagingException { //邮件设置2:一个复杂的邮件 MimeMessage mimeMessage = mailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true); helper.setSubject("通知-明天来狂神这听课"); helper.setText("今天 7:30来开会",true); //发送附件 helper.addAttachment("1.jpg",new File("")); helper.addAttachment("2.jpg",new File("")); helper.setTo("24736743@qq.com"); helper.setFrom("24736743@qq.com"); mailSender.send(mimeMessage);}
查看邮箱,邮件接收成功!
我们只需要使用Thymeleaf进行前后端结合即可开发自己网站邮件收发功能了!
flask-mail异步发送邮件_异步、定时、邮件任务相关推荐
- flask-mail异步发送邮件_使用 python 发送邮件
使用 python 发送邮件,这个也没啥讲的,分享三种方式发送邮件,最后一种三行代码就可以发送邮件,是不是很爽啊,话不多说,直接上代码 第一种:正常发送邮件,也就是同步发送邮件 #!/usr/bin/ ...
- flask-mail异步发送邮件_.NET Core使用FluentEmail发送邮件
前言 在实际的项目开发中,我们会遇到许多需要通过程序发送邮件的场景,比如异常报警.消息.进度通知等等.一般情况下我们使用原生的SmtpClient类库居多,它能满足我们绝大多数场景.但是使用起来不够简 ...
- 同步等待 异步等待_异步/等待与承诺互操作性
同步等待 异步等待 Usually, when discussing Promises and async/await syntax, people frame it as an "eith ...
- 同步等待 异步等待_异步/等待和承诺的解释
同步等待 异步等待 The async / await operators make it easier to implement many async Promises. They also all ...
- nodejs异步测试_异步过程的自动化测试
nodejs异步测试 自从我开发了具有异步行为的服务器端应用程序以来已经有一段时间了,而该行为还不是事件驱动的系统. 异步行为始终是设计和测试中一个有趣的挑战. 通常,异步行为不应该很难进行单元测试– ...
- java jpa 异步编程_异步处理时的JPA
java jpa 异步编程 几年前,在Java世界中,几乎显而易见的是,每个"企业"类项目都需要JPA与数据库进行通信. JPA是Joel Spolsky描述的" 泄漏抽 ...
- 异步重试_异步重试模式
异步重试 当您有一段经常失败且必须重试的代码时,此Java 7/8库提供了丰富且简洁的API以及针对此问题的快速且可扩展的解决方案: ScheduledExecutorService schedule ...
- 异步生成器_异步生成器作为状态管理的替代方法
异步生成器 Async Generators is a simple but powerful feature that is now a part of JavaScript. It unlocks ...
- servlet3异步 例子_异步Servlet示例
servlet3异步 例子 Async servlet was introduced in Servlet 3. It's a great way to deal with thread starva ...
最新文章
- SpringBoot + Vue + nginx项目一起部署
- Android --- 按钮控件设置与不设置背景都会有一个小小的灰色阴影怎么去掉?
- executequery方法_在IDEA的maven项目中连接使用MySQL8.0方法教程
- 三星s2 硬刷Android 8,三星T710(GALAXY Tab S2 8.0)一键救砖教程,轻松刷回官方系统...
- 【转】android TV CTS 4.0.3_r1测试
- 数据科学家 数据工程师_发展数据科学家和工程师
- 动态删除列表中的元素
- ENVI数据类型和MATLAB数据类型对比
- 上海项目危机经历与感想
- Metasploit学习2-后门制作
- django 框架 SQL 语句 查询篇
- 测绘类专业计算机要学什么科目,测绘类包括哪些专业
- 网站哪些功能可以提高用户体验度?
- python中int函数的用法浅析_python中int函数怎么用,
- 年度榜单!我整理了2020年优质的Python文章和资源。
- Linux CPU频率控制
- linux提权参考方法
- 视频教程-嵌入式读图基础-智能硬件
- 那些年啊,那些事——一个程序员的奋斗史 ——127
- 人脸识别评价指标: TAR@FAR
热门文章
- 干货分享|UI设计可临摹编辑的线框素材,还会觉得交互原型画得丑?
- android中activity布局,Android中登录布局展示Activity
- java bytebuffer 读写_java nio bytebuffer文件读写问题
- “JavaSwing” ——简单使用
- Spring 框架 AOP 的总结
- nohttp网络框架
- mysql作业是什么意思_MySQL 作业七
- 去除div css背景,jQuery-拖动div CSS背景
- c语言学习-有一12个元素的整型数组b,从键盘输入数据,请以每行4个数据各个数据之间空两格的形式输出b数组的12个元素
- Unity2020.1新功能探路:Profiler相关更新