Spring Boot与任务

异步任务、定时任务、邮件任务

异步任务

异步任务,是Spring帮我们开启线程池,创建一个新的线程来执行我们的方法,就不会有卡顿的现象。

在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的;但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在Spring 3.x之后,就已经内置了@Async来完美解决这个问题。

两个注解:
@EnableAysnc、@Aysnc

1)创建Springboot项目,添加Web模块。

2) 创建service、controller模块

3)启动Springboot应用

在浏览器中输入:http://localhost:8080/async

4) 修改成异步执行

添加@Async注解:表示是异步方法。

在启动类上,添加@EnableAsync注解

5)重启应用

在浏览器中输入:http://localhost:8080/async

会发现,页面会瞬速响应,而控制台的执行任务的输出会停顿三秒。起到了异步的效果!


定时任务

项目开发中经常需要执行一些定时任务,比如需要在每天凌晨时候,分析一次前一天的日志信息。Spring为我们提供了异步执行任务调度的方式,提供TaskExecutor 、TaskScheduler 接口

两个注解@EnableScheduling、@Scheduled

cron表达式:

1)在service包:创建ScheduledService:

@Service
public class ScheduledService {

    /**
     * second(秒) , minute(分), hour(时), day of month(日), month(月) , day of week.(周几)
     * 例子:[0 * * * * MON-SAT]:代表每月,每日,每时,每分每秒的周一到周六的0秒执行
     */
    @Scheduled(cron ="0 * * * * MON-SAT")
    public void hello(){
        System.out.println("hello ···");
    }
}

2)在启动类上,添加@EnableScheduling:

3)启动应用

更多写法:参考上面的cron表达式

,(逗号):枚举的意思,[0,1,2,3,4 * * * * *]:就是0、1、2、3、4秒执行一次

-(减号):区间的意思,[0-4 * * * * *] : 和上面的意思一样

/(斜杆):步长的意思,[0/4 * * * * *]:就是0秒开始执行,每隔4秒执行一次

当每日与周几冲突时,请使用 ?代替 *。

案例:

[0 0/5 14,18 * * ?]:每天14整点,和18整点,每隔5分钟执行一次。

[0 15 10 ? * 1-6]: 每个月的周一到周六10:15:00执行一次

[0 0 2 ?* 6L]:每个月的最后一个周六凌晨两点执行一次

[0 0 2 LW * ?]:每个月的最后一个工作日凌晨两点执行一次

[0 0 2-4 ? * 1#1]:每一个月的第一个周一凌晨2点到4点期间,每个整点,整秒执行一次。(ps:1#4 就是每个月的第四个周一)

邮件任务

• 邮件发送需要引入spring-boot-starter-mail
• Spring Boot 自动配置MailSenderAutoConfiguration
• 定义MailProperties内容,配置在application.yml中
• 自动装配JavaMailSender
• 测试邮件发送

接下来,我们演示:使用QQ邮箱给163邮箱发送邮件的案例

1)导入spring-boot-starter-mail依赖:

2)配置邮件的信息:

spring.mail.username:设置发送者的邮箱的用户名

spring.mail.password:不是登入邮箱的密码,而是你的邮箱的服务器的生成的密码。

如果使用的是qq邮箱的话,打开qq邮箱,点击设置:

然后点击账号,找到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务:

将POP3/SMTP服务开启,点击开启:

发送短信:点击我已发送:

看到下面的密码了,就是你的设置密码了。

spring.mail.password=eaqltjcbbababcje

spring.mail.host:配置的是你的邮箱服务器的SMTP地址

spring.mail.host=smtp.qq.com

完整的application配置文件内容:

#qq邮箱的用户名
spring.mail.username=575920824@qq.com
#你的服务器生成的POP3安全密码
spring.mail.password=eaqltjcbbababcje
#配置的是你的邮箱服务器的SMTP
spring.mail.host=smtp.qq.com

3) 在测试类下,编写发送邮件的测试方法

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBoot04TaskApplicationTests {

    @Autowired
    private JavaMailSenderImpl javaMailSender;

    @Test
    public void sendSimpleMail(){
        SimpleMailMessage mailMessage = new SimpleMailMessage();
        //设置主题
        mailMessage.setSubject("今天下午7点到9点开会");
        //设置正文
        mailMessage.setText("关于XXX的会议");
        //设置接受者:你的163邮箱的账号
        mailMessage.setTo("18896991176@163.com");
        //设置发送者
        mailMessage.setFrom("575920824@qq.com");
        javaMailSender.send(mailMessage);
    }

}

4) 测试运行:

发送成功:如果你的出现异常,请在application配置文件中:

添加:spring.mail.properties.mail.smtp.sst.enable=true

打开你的163邮箱:


以上就是发送简单邮箱的方法,现在我们来发送复杂邮件,携带附件的邮箱:

    @Test
    public void sendMail() throws Exception{
        //创建复杂邮件
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
         //new一个复杂邮件的工具类
        //第二个参数:true,表示发送附件的邮箱
        MimeMessageHelper message = new MimeMessageHelper(mimeMessage,true);
        //设置主题
        message.setSubject("今天下午7点到9点开会");
        //设置正文,第二个参数:表示发送的是html的文本
        message.setText("<b style='color:red'>关于XXX的会议</b>",true);
        //设置接受者
        message.setTo("18896991176@163.com");
        //设置发送者
        message.setFrom("575920824@qq.com");

        //上传附件
        message.addAttachment("1.jpg",new File("C:\\Users\\liuzhuo\\Pictures\\Saved Pictures\\123.jpg"));
        message.addAttachment("2.jpg",new File("C:\\Users\\liuzhuo\\Pictures\\Saved Pictures\\gakki.jpg"));

        //发送邮件
        javaMailSender.send(mimeMessage);
    }

测试:



  转载请注明: 解忧杂货店 Spring Boot与任务

  目录