Java的任务在项目中需要用到的地方很多,比如,每月月末的财务报表给财务部门,定时给领导发个邮件短信等等。这时候我们就需要用到任务了,任务调度本身涉及到多线程并发、运行时间规则制定和解析、场景保持与恢复、线程池维护等诸多方面的工作。之前的学习中也使用过任务的框架Quartz,用起来也十分地编辑。本篇文章主要讲的是SpringBoot中基于注解的任务调度的简单使用。

 一.异步任务

正常情况下,同一线程中的方法是同步执行的,比如我要请求一段数据,但是这个数据等待service层执行3s之后,然后才能返回给我,而且这个service层与我想到得到的数据没有丝毫关系。如果想要不等待service层处理数据的话,只能开启一个线程去执行service层方法,然后另外一个线程直接返回数据给我。但是这样做的话会变得很麻烦,所以我们可以使用异步任务的方式,就可以实现我上面的需求。

1.1 开启异步任务注解

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

1.2 异步任务执行方法

@Service
public class AsyncService {
@Async
public void hello(){
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("处理数据中");
}
}

1.3 异步任务测试

@Controller
public class AsyncController {
@Autowired
AsyncService asyncService; @GetMapping("/hello")
@ResponseBody
public String hello(){
asyncService.hello();
return "success";
}
}

运行项目,访问“/hello”请求,若页面没有经过等待直接返回“success”数据,经过3s之后控制台打印了“处理数据中”说明该异步任务执行成功。

二.定时任务

定时任务的使用方式和异步任务的差不多。不过需要注意的是定时任务的core表达式。

2.1 core表达式

例如:

@Scheduled(cron = "0 * * * * MON-SAT")  每分钟的整秒的时候执行该方法

@Scheduled(cron = "0,1,2,3,4 * * * * MON-SAT")  每分钟0,1,3,4秒的的时候执行该方法

@Scheduled(cron = "0-4 * * * * MON-SAT")  每分钟0,1,3,4秒的的时候执行该方法

@Scheduled(cron = "0/4 * * * * MON-SAT") 每四秒执行一次 (/设定步长)

@Scheduled(cron = "0 0 2-4 ? * 1#1") 每个月的第一个周一凌晨2点到4点期间, 每个整点都执行一次

2.2 定时任务使用

@EnableScheduling //开启定时任务注解
@SpringBootApplication
public class Springboot04TaskApplication {
public static void main(String[] args) {
SpringApplication.run(Springboot04TaskApplication.class, args);
} }
@Service
public class ScheduledService {
/**
* second,minute,hour,day of month,month,day of week
* 0 * * * * MON-FRI
*/
@Scheduled(cron = "0/4 * * * * MON-SAT") //每四秒执行一次 (/设定步长)
public void say(){
System.out.println("Hello...");
}
}

三.邮件任务

SpringBoot还整合了邮件任务功能,这使得邮箱服务器发送邮件变得十分容易。

3.1 准备工作

3.1.1 导入邮件任务依赖

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

3.1.2 邮箱配置

准备两个邮箱,一个用来发送邮件,另一个用来接收邮件。其中发件的邮箱需要配置开启一下SMTP服务器服务,开启的后会得到发件邮箱密钥,记得保存起来,这将会在后面用到。

3.2 配置参数

spring.mail.username=**********@qq.com
#填入上面开启服务获得的密钥
spring.mail.password=*************
spring.mail.host=smtp.qq.com
#配置安全链接
spring.mail.properties.mail.smtp.ssl.enable=true

3.3 发送简单邮件

@Autowired
JavaMailSenderImpl mailSender;
@Test
public void contextLoads() {
SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
simpleMailMessage.setSubject("通知");//设置标题
simpleMailMessage.setText("恭喜你获得了优秀员工奖");//内容
simpleMailMessage.setTo("*********@163.com"); //收件人邮箱账户
simpleMailMessage.setFrom("********@qq.com"); //寄件人邮箱账户
mailSender.send(simpleMailMessage);
}

3.4 发送复杂邮件

@Autowired
JavaMailSenderImpl mailSender;
@Test
public void compMail(){
MimeMessage mimeMessage = mailSender.createMimeMessage();
try {
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
mimeMessageHelper.setSubject("重要通知");//设置标题
mimeMessageHelper.setText("恭喜你获得了优秀员工奖");//内容
mimeMessageHelper.setText("<b style='color:red'>年终奖翻倍</b>",true);//内容 第二个参数设置是否识别html,true表示识别为html内容
mimeMessageHelper.addAttachment("1.jpg",new File("C:\\Users\\admin\\Desktop\\快递\\快递面单\\圆通.png")); //传输文件
mimeMessageHelper.addAttachment("2.jpg",new File("C:\\Users\\admin\\Desktop\\workdown\\pic\\jvm运行时数据区域.jpg"));
mimeMessageHelper.setTo("************@163.com"); //收件人邮箱
mimeMessageHelper.setFrom("*********@qq.com"); //寄件人邮箱
mailSender.send(mimeMessage);
} catch (MessagingException e) {
e.printStackTrace();
} }

SpringBoot任务篇Ⅴ --- 异步任务、定时任务、邮件任务的更多相关文章

  1. springboot中的任务(异步任务--定时任务--邮件任务)

    1.pom文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...

  2. 日夕如是寒暑不间,基于Python3+Tornado6+APScheduler/Celery打造并发异步动态定时任务轮询服务

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_220 定时任务的典型落地场景在各行业中都很普遍,比如支付系统中,支付过程中因为网络或者其他因素导致出现掉单.卡单的情况,账单变成了 ...

  3. (二)SpringBoot基础篇- 静态资源的访问及Thymeleaf模板引擎的使用

    一.描述 在应用系统开发的过程中,不可避免的需要使用静态资源(浏览器看的懂,他可以有变量,例:HTML页面,css样式文件,文本,属性文件,图片等): 并且SpringBoot内置了Thymeleaf ...

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

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

  5. springboot开篇 (一)简单邮件发送

    上篇终结篇为spring 发送邮件,这次将使用springboot 发送邮件,同时本篇将作为springboot入门篇. 新建一个工程..工程目录结构如下,此次使用idea进行开发.对于一个长期使用e ...

  6. 定时任务-----Springboot中使用Scheduled做定时任务----http://www.cnblogs.com/lirenqing/p/6596557.html

    Springboot中使用Scheduled做定时任务---http://www.cnblogs.com/lirenqing/p/6596557.html 已经验证的方案: pom文件加入依赖 < ...

  7. 视频作品《springboot基础篇》上线了

    1.场景描述 第一个视频作品出炉了,<springboot基础篇>上线了,有需要的朋友可以直接点击链接观看.(如需购买,请通过本文链接购买) 2. 课程内容 课程地址:https://ed ...

  8. SpringBoot Web篇(二)

    摘要 继上一篇 SpringBoot Web篇(一) 文件上传 当我们服务器需要接收用户上传的文件时,就需要使用MultipartFile作为参数接收文件.如下: @PostMapping(" ...

  9. SpringBoot中使用@Scheduled创建定时任务

    SpringBoot中使用@Scheduled创建定时任务 定时任务一般会在很多项目中都会用到,我们往往会间隔性的的去完成某些特定任务来减少服务器和数据库的压力.比较常见的就是金融服务系统推送回调,一 ...

随机推荐

  1. 【题解】P4137 Rmq Problem(莫队)

    [题解]P4137 Rmq Problem(莫队) 其实这道题根本就不用离散化! 因为显然有\(mex\)值是\(\le 2\times 10^5\)的,所以对于大于\(2\times 10^5\)的 ...

  2. $Noip2018/Luogu5022$ 旅行

    $Luogu$ $Description$ 一个$n$个点,$m$条边的图.$m=n-1$或$m=n$.任意选取一点作为起始点,可以去往一个没去过的点,或者回到第一次到达这个点时来自的点.要求遍历整个 ...

  3. linux权限说明

    Linux 中的权限 这里我拿一个tomcat目录举例说明.首先我们在linux系统中执行命令:ls -l 我们拿出其中一个说明-rwxr-xr-x,在Linux 系统中权限是区分用户的,即用户.组用 ...

  4. 异常记录——bat批处理闪退

    bat批处理闪退 bat描述 我的博客每次更新需要跑多个命令 clean(清除旧文)+g(生成新文)+d(部署到服务器),作为一个懒惰的程序员,自然要写一个bat一键完成 E: cd blog hex ...

  5. 通俗易懂理清mybatis中SqlSessionSql、SqlSessionTemplate、SessionFactory和SqlSessionFactoryBean之间的关系

    我潇洒的灰大狼又回来啦.今天送大家的一句话是: 保持耐心,永远年轻,永远热泪盈眶. 前言 先容我哭一会儿,呜呜呜~昨晚写了一半的文章,还没保存就盖上盖子准备回家,拔下电源准备把电脑塞进书包带回家完成时 ...

  6. 前端面试基础回顾之深入JS继承

    前言 对于灵活的js而言,继承相比于java等语言,继承实现方式可谓百花齐放.方式的多样就意味着知识点繁多,当然也是面试时绕不开的点.撇开ES6 class不谈,传统的继承方式你知道几种?每种实现原理 ...

  7. Flutter 不能热加载,热重载按钮灰色,无法点击,flutter doctor 显示NO_PROXY is not set

    一.现象: Flutter 不能热加载 热重载按钮灰色,无法点击. 二.分析原因: 终端 flutter doctor 显示 NO_PROXY is not set 没有设置无代理的端口 终端:flu ...

  8. Flutter中Expanded组件用法

    Flutter中Expanded组件用法 Expanded组件可以使Row.Column.Flex等子组件在其主轴方向上展开并填充可用空间(例如,Row在水平方向,Column在垂直方向).如果多个子 ...

  9. 再也不怕和老外交流了!我用python实现一个微信聊天翻译助手!

    前言 在前面的一篇文章如何用python“优雅的”调用有道翻译中咱们清楚的写过如何一层一层的解开有道翻译的面纱,并且笔者说过那只是脑洞的开始.现在笔者又回来了.当你遇到一些外国小哥哥小姐姐很心动.想结 ...

  10. Quartz定时任务整理

    一. 介绍 Quartz是一个开源的定时任务调度框架,这里就不详细介绍了,我们直入主题Quartz主要由三部分组成 任务:JobDetail 触发器:Trigger,(分两类:SimpleTrigge ...