异步任务

“异步调用”对应的是“同步调用”,同步调用指程序按照定义顺序依次执行,每一行程序都必须等待上一行程序执行完成之后才能执行;异步调用指程序在顺序执行时,不等待异步调用的语句返回结果就执行后面的程序。

@Service
public class AsyncService { public void testTask(){
try{
Thread.sleep(3000);
}catch (Exception e){ }
System.out.println("哈哈哈哈");
}
}

上述的同步调用虽然顺利的执行完了,可以并发执行的话,同步调用在执行效率方面就比较差,可以考虑通过异步调用的方式来并发执行。

在Spring Boot中,我们只需要通过使用@Async注解就能简单的将原来的同步函数变为异步函数,主类改在为如下模式:

@EnableAsync //开启异步注解
@SpringBootApplication
public class DemoApplication { public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}

service修改如下,加上@Async注解,就能有效的减少了程序的总运行时间。

@Service
public class AsyncService { @Async //注解
public void testTask(){
try{
Thread.sleep(3000);
}catch (Exception e){ }
System.out.println("哈哈哈哈");
}
}

注: @Async所修饰的函数不要定义为static类型,这样异步调用不会生效。

定时任务

在编写Spring Boot应用中经常会遇到这样的场景,比如:我需要定时地发送一些短信、邮件之类的操作,也可能会定时地检查和监控一些标志、参数等。

1.编写主程序

@EnableAsync //开启异步注解
@EnableScheduling //开启定时注解
@SpringBootApplication
public class DemoApplication { public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}

2.编写测试类

@Service
public class ScheduledService { /**
* 指定定时任务的表达式
* second(秒),minute(分),hour(日),day of month(日),month(月),day of week(周几)。空格隔开
*/ //每5秒走一次
@Scheduled(cron = "*/5 * * * * *")
public void hello(){
System.out.println("hello");
}
}
  • @Scheduled(fixedRate = 5000) :上一次开始执行时间点之后5秒再执行
  • @Scheduled(fixedDelay = 5000) :上一次执行完毕时间点之后5秒再执行
  • @Scheduled(initialDelay=1000, fixedRate=5000) :第一次延迟1秒后执行
  • @Scheduled(cron="0/5 * * * * *") :通过cron表达式定义规则。0秒启动,每5秒启动一次

邮件任务

相信使用过Spring的众多开发者都知道Spring提供了非常好用的JavaMailSender接口实现邮件发送。

在Spring Boot的Starter模块中也为此提供了自动化配置。

1.在pom.xml中引入依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>

如其他自动化配置模块一样,在完成了依赖引入之后,只需要在application.properties中配置相应的属性内容。

2.以QQ邮箱为例,在application.properties中加入如下配置(注意替换自己的用户名和密码):

spring.mail.host=smtp.qq.com
spring.mail.username=用户名
spring.mail.password=密码
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true

3.编写测试类

@Service
public class ScheduledService { @Autowired
JavaMailSenderImpl javaMailSender; public void sendMail(){
SimpleMailMessage message = new SimpleMailMessage(); //邮件设置 标题
message.setSubject("你猜");
//内容
message.setText("你猜我是谁");
//收件人
message.setTo("");
//发件人
message.setFrom(""); javaMailSender.send(message);
}
}

到这里,一个简单的邮件发送就完成了.

MimeMessage

上面是通过使用SimpleMailMessage实现了简单的邮件发送,但是实际使用过程中,我们还可能会带上附件、或是使用邮件模块等。这个时候我们就需要使用MimeMessage来设置复杂一些的邮件内容。

    public void sendMail02() throws MessagingException {

        //创建一个复杂邮件
MimeMessage mimeMessage = javaMailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true); //邮件设置 标题
helper.setSubject("你猜");
//内容 可以兼容html片段
helper.setText("<b>你猜我是谁</b>");
//参数2: 解析HTML
helper.setText("<html><body><img src=\"cid:weixin\" ></body></html>", true); //上传附件 参数1:名称 参数2:文件
helper.addAttachment("1.jpg",new File(""));
//收件人
helper.setTo("");
//发件人
helper.setFrom(""); javaMailSender.send(mimeMessage);
}

SpringBoot(十) 异步任务,定时任务和邮件任务的更多相关文章

  1. 【java框架】SpringBoot(4)--SpringBoot实现异步、邮件、定时任务

    1.SpringBoot整合任务机制 1.1.SpringBoot实现异步方法 日常开发中涉及很多界面与后端的交互响应,都不是同步的,基于SpringBoot为我们提供了注解方式实现异步方法.使得前端 ...

  2. springboot(十):邮件服务

    springboot仍然在狂速发展,才五个多月没有关注,现在看官网已经到1.5.3.RELEASE版本了.准备慢慢在写写springboot相关的文章,本篇文章使用springboot最新版本1.5. ...

  3. Spring Boot 2.X(十二):定时任务

    简介 定时任务是后端开发中常见的需求,主要应用场景有定期数据报表.定时消息通知.异步的后台业务逻辑处理.日志分析处理.垃圾数据清理.定时更新缓存等等. Spring Boot 集成了一整套的定时任务工 ...

  4. SpringBoot使用异步线程池实现生产环境批量数据推送

    前言 SpringBoot使用异步线程池: 1.编写线程池配置类,自定义一个线程池: 2.定义一个异步服务: 3.使用@Async注解指向定义的线程池: 这里以我工作中使用过的一个案例来做描述,我所在 ...

  5. Jenkins+Jmeter持续集成笔记(四:定时任务和邮件通知)

    通过前几篇文章,jmeter+ant+jenkins自动化持续构建的测试平台基本成型.既然要自动化平台,最基本的肯定要实现不经过人工干预,平台会在特定的条件下自动运行测试脚本,并在脚本运行结束后,发送 ...

  6. SpringBoot中异步请求和异步调用(看这一篇就够了)

    原创不易,如需转载,请注明出处https://www.cnblogs.com/baixianlong/p/10661591.html,否则将追究法律责任!!! 一.SpringBoot中异步请求的使用 ...

  7. Celery+python+redis异步执行定时任务

    我之前的一篇文章中写了[Celery+django+redis异步执行任务] 博文:http://blog.csdn.net/apple9005/article/details/54236212 你会 ...

  8. springboot(十四):springboot整合shiro-登录认证和权限管理(转)

    springboot(十四):springboot整合shiro-登录认证和权限管理 .embody{ padding:10px 10px 10px; margin:0 -20px; border-b ...

  9. springboot(十九)使用actuator监控应用【转】【补】

    springboot(十九)使用actuator监控应用 微服务的特点决定了功能模块的部署是分布式的,大部分功能模块都是运行在不同的机器上,彼此通过服务调用进行交互,前后台的业务流会经过很多个微服务的 ...

随机推荐

  1. DELPHI调试出现disconnected session的解决办法

    我在控制面板中,是禁用了UAC的,如下图 但是,在注册表中启用了UAC(EnableLUA), 工程中请求了管理员权限,如下图: 所以,整个权限请求混乱了. 解决办法,要么把注册表的LUA设置为0,要 ...

  2. 三维重建:Kinect几何映射-SDK景深数据处理

    此文大量使用XML,非C类的代码,看看图即可. 原文链接:Kinect for Windows SDK开发入门(五):景深数据处理 3. 对物体进行测量 像上篇文章中对深度值测量原理进行讨论的那样,像 ...

  3. DDoS攻击与防范策略

    DDoS(Distributed Denial of Service,分布式拒绝服务)攻击的主要目的是让指定目标无法提供正常服务,甚至从互联网上消失,是目前最强大.最难防御的攻击之一. 按照发起的方式 ...

  4. 347. 前K个高频元素

    题目描述 给定一个非空的整数数组,返回其中出现频率前 k 高的元素. 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输入: nums = ...

  5. day25-3 json,pickle模块

    目录 json 序列化 反序列化 pickle json json文件并不是python独有的,所有的语言都有json,可以跨平台/语言传输数据 json文件中只能写入python中的dict/lis ...

  6. Java IO 流总结

    Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...

  7. 计蒜客 第 m 大的身份证号码 (水)

    链接 : Here! 思路 : 水题 代码 : #include <cstdio> #include <string> #include <iostream> #i ...

  8. Codeforces 787B Not Afraid( 水 )

    链接:传送门 题意:判断 m 组数,如果某一组中出现负数就判断这一组中是否存在与之相反的数,如果每一组中都满足要求则输出 "NO" 反之输出 "YES" 思路: ...

  9. UVA10340 - All in All(紫书习题3.9)

    输入两个字符串s和t,判断是否可以从t中删除0个或者多个字符(其他字符顺序不变),得到字符串s.例如,abcde可以得到bce,但无法得到cb. Input 输入多组数据 每组一行包含两个字符串s和t ...

  10. 训练1-L

    n个人一起排队接水,第i个人需要ai的时间来接水. 1 <= n <= 1000 1 <= a,i<= 1000 同时只能有一个人接水,正在接水的人和没有接水的人都需要等待. ...