springboot 与异步任务,定时任务,邮件任务

异步任务

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

SpringBoot 实现比较简单

主启动类:添加 注释:@EnableAsync

java 复制代码
@EnableScheduling
@EnableAsync
@MapperScan("com.hrp.**.dao")
@SpringBootApplication
public class EcsApplication {
    public static void main(String[] args) {
        SpringApplication.run(EcsApplication.class, args);
    }

}

业务方法添加 @Async

java 复制代码
 @Async
    @Override
    public void TestAsync() {
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("-------------");
    }

controller调用

java 复制代码
@RequestMapping("myFreeMark")
    public String myFreeMark(Map<String,Object> map){
        map.put("name","zhangsan");
        map.put("mydate",new Date());
        asyncServer.TestAsync();
        System.out.println("==================FreemarkerController=======myFreeMark=====");
        return "myFreeMark";
    }

访问看到控制台打印顺序可以知道TestAsync方法异步调用

定时任务

项目开发中经常需要执行一些定时任务,比如需要在每天凌晨时候,分析一次前

一天的日志信息。Spring为我们提供了异步执行任务调度的方式,提供TaskExecutor 、TaskScheduler 接口。

主启动类:增加@EnableScheduling

java 复制代码
@EnableScheduling
@EnableAsync
@MapperScan("com.hrp.**.dao")
@SpringBootApplication
public class EcsApplication {
    public static void main(String[] args) {
        SpringApplication.run(EcsApplication.class, args);
    }

}

任务类:类增加@Service或者@Compont注释方法增加@Scheduled注解

java 复制代码
@Service
public class BackUpMysqlTask {

    /**
     * Seconds : 可出现", - * /"四个字符,有效范围为0-59的整数
     * Minutes : 可出现", - * /"四个字符,有效范围为0-59的整数
     * Hours : 可出现", - * /"四个字符,有效范围为0-23的整数
     * DayofMonth : 可出现", - * / ? L W C"八个字符,有效范围为0-31的整数
     * Month : 可出现", - * /"四个字符,有效范围为1-12的整数或JAN-DEc
     * DayofWeek : 可出现", - * / ? L C #"四个字符,有效范围为1-7的整数或SUN-SAT两个范围。1表示星期天,2表示星期一, 依次类推
     * Year : 可出现", - * /"四个字符,有效范围为1970-2099年
     */
    @Scheduled(cron = "0 * * * * MON-FRI")
    public void backUpMysql() {
        System.out.println("===============");
    }
}

我们可以观察到控制台不断的再打印

这里要讲解cron


java 复制代码
 /**
     * Seconds : 可出现", - * /"四个字符,有效范围为0-59的整数
     * Minutes : 可出现", - * /"四个字符,有效范围为0-59的整数
     * Hours : 可出现", - * /"四个字符,有效范围为0-23的整数
     * DayofMonth : 可出现", - * / ? L W C"八个字符,有效范围为0-31的整数
     * Month : 可出现", - * /"四个字符,有效范围为1-12的整数或JAN-DEc
     * DayofWeek : 可出现", - * / ? L C #"四个字符,有效范围为1-7的整数或SUN-SAT两个范围。1表示星期天,2表示星期一, 依次类推
     * Year : 可出现", - * /"四个字符,有效范围为1970-2099年
     */

下面简单举几个例子:

"0 0 12 * * ?" 每天中午十二点触发

"0 15 10 ? * *" 每天早上10:15触发

"0 15 10 * * ?" 每天早上10:15触发

"0 15 10 * * ? *" 每天早上10:15触发

"0 15 10 * * ? 2005" 2005年的每天早上10:15触发

"0 * 14 * * ?" 每天从下午2点开始到2点59分每分钟一次触发

"0 0/5 14 * * ?" 每天从下午2点开始到2:55分结束每5分钟一次触发

"0 0/5 14,18 * * ?" 每天的下午2点至2:55和6点至6点55分两个时间段内每5分钟一次触发

"0 0-5 14 * * ?" 每天14:00至14:05每分钟一次触发

"0 10,44 14 ? 3 WED" 三月的每周三的14:10和14:44触发

"0 15 10 ? * MON-FRI" 每个周一、周二、周三、周四、周五的10:15触发

邮件任务

准备工作

做过邮件的都大家都知道

所以我们要是使用qq邮箱发送必须有登录qq邮箱的权限

开启smtp服务,发送短信我们就可以获取一个授权码,自己拷贝下来下图的授权码记录下来

开始

添加依赖

java 复制代码
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>

配置

java 复制代码
  mail:
    host: smtp.qq.com  其他邮箱需要修改
    username: 邮箱账户
    password: 授权码
    properties:
      mail:
        smtp:
          ssl:
            enable: true

测试代码

java 复制代码
 @Autowired
    private JavaMailSender javaMailSender;
    @Test
    void contextLoads() {
        SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
        simpleMailMessage.setText("ddd");
        simpleMailMessage.setSubject("主题");
        simpleMailMessage.setTo("");
        simpleMailMessage.setFrom("");
        javaMailSender.send(simpleMailMessage);
    }

我们可以查收到邮件

上面是普通的邮件

发送html内容

java 复制代码
 @Test
    public void testSend() throws MessagingException {
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage);
        messageHelper.setSubject("标题");
        messageHelper.setTo("@dhcc.com.cn");
        messageHelper.setFrom("@qq.com");
        messageHelper.setText("<h1>标题</h1><br/><p>这是内容</p>", true);
        javaMailSender.send(messageHelper.getMimeMessage());
    }

这里需要注意的是,setText的时候需要传一个布尔值进去,表名需要使用HTML样式。

最后代码附件

java 复制代码
package com.hrp.msage.service;

import javax.mail.MessagingException;

/**
 * ecs
 *
 * @Title: com.hrp.msage.service
 * @Date: 2020/7/29 13:48
 * @Author: wfg
 * @Description:
 * @Version:
 */
public interface MailService {
    /**
     * 简单文本邮件
     * @param to 接收者邮件
     * @param subject 邮件主题
     * @param contnet 邮件内容
     */
    public void sendSimpleMail(String to, String subject, String contnet);
    /**
     * HTML 文本邮件
     * @param to 接收者邮件
     * @param subject 邮件主题
     * @param contnet HTML内容
     * @throws MessagingException
     */
    public void sendHtmlMail(String to, String subject, String contnet) throws MessagingException;
    /**
     * 附件邮件
     * @param to 接收者邮件
     * @param subject 邮件主题
     * @param contnet HTML内容
     * @param filePath 附件路径
     * @throws MessagingException
     */
    public void sendAttachmentsMail(String to, String subject, String contnet,
                                    String filePath) throws MessagingException;
    /**
     * 图片邮件
     * @param to 接收者邮件
     * @param subject 邮件主题
     * @param contnet HTML内容
     * @param rscPath 图片路径
     * @param rscId 图片ID
     * @throws MessagingException
     */
    public void sendInlinkResourceMail(String to, String subject, String contnet,
                                       String rscPath, String rscId);
}
java 复制代码
package com.hrp.msage.serviceImpl;

import com.hrp.msage.service.MailService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;

/**
 * ecs
 *
 * @Title: com.hrp.msage.serviceImpl
 * @Date: 2020/7/29 13:48
 * @Author: wfg
 * @Description:
 * @Version:
 */
@Service("mailService")
public class MailServiceImpl implements MailService {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Value("${spring.mail.username}")
    private String from;

    @Autowired
    private JavaMailSender mailSender;

    /**
     * 简单文本邮件
     * @param to 接收者邮件
     * @param subject 邮件主题
     * @param contnet 邮件内容
     */
    @Override
    public void sendSimpleMail(String to, String subject, String contnet){
        SimpleMailMessage message = new SimpleMailMessage();
        message.setTo(to);
        message.setSubject(subject);
        message.setText(contnet);
        message.setFrom(from);
        mailSender.send(message);
    }
    /**
     * HTML 文本邮件
     * @param to 接收者邮件
     * @param subject 邮件主题
     * @param contnet HTML内容
     * @throws MessagingException
     */
    @Override
    public void sendHtmlMail(String to, String subject, String contnet) throws MessagingException {
        MimeMessage message = mailSender.createMimeMessage();

        MimeMessageHelper helper = new MimeMessageHelper(message, true);
        helper.setTo(to);
        helper.setSubject(subject);
        helper.setText(contnet, true);
        helper.setFrom(from);

        mailSender.send(message);
    }

    /**
     * 附件邮件
     * @param to 接收者邮件
     * @param subject 邮件主题
     * @param contnet HTML内容
     * @param filePath 附件路径
     * @throws MessagingException
     */
    @Override
    public void sendAttachmentsMail(String to, String subject, String contnet,
                                    String filePath) throws MessagingException {
        MimeMessage message = mailSender.createMimeMessage();

        MimeMessageHelper helper = new MimeMessageHelper(message, true);
        helper.setTo(to);
        helper.setSubject(subject);
        helper.setText(contnet, true);
        helper.setFrom(from);

        FileSystemResource file = new FileSystemResource(new File(filePath));
        String fileName = file.getFilename();
        helper.addAttachment(fileName, file);

        mailSender.send(message);
    }

    /**
     * 图片邮件
     * @param to 接收者邮件
     * @param subject 邮件主题
     * @param contnet HTML内容
     * @param rscPath 图片路径
     * @param rscId 图片ID
     * @throws MessagingException
     */
    @Override
    public void sendInlinkResourceMail(String to, String subject, String contnet,
                                       String rscPath, String rscId) {
        logger.info("发送静态邮件开始: {},{},{},{},{}", to, subject, contnet, rscPath, rscId);

        MimeMessage message = mailSender.createMimeMessage();
        MimeMessageHelper helper = null;

        try {

            helper = new MimeMessageHelper(message, true);
            helper.setTo(to);
            helper.setSubject(subject);
            helper.setText(contnet, true);
            helper.setFrom(from);

            FileSystemResource res = new FileSystemResource(new File(rscPath));
            helper.addInline(rscId, res);
            mailSender.send(message);
            logger.info("发送静态邮件成功!");

        } catch (MessagingException e) {
            logger.info("发送静态邮件失败: ", e);
        }

    }



}
java 复制代码
package com.hrp;

import com.hrp.msage.service.MailService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import javax.mail.MessagingException;

/**
 * ecs
 *
 * @Title: com.hrp
 * @Date: 2020/7/29 13:57
 * @Author: wfg
 * @Description:
 * @Version:
 */
@SpringBootTest
public class MailServiceTest {


    @Autowired
    private MailService mailService;

//    @Resource
//    private TemplateEngine templateEngine;

    @Test
    public void sendSimpleMail() {
        mailService.sendSimpleMail("wufagang@dhcc.com.cn","测试spring boot imail-主题","测试spring boot imail - 内容");
    }

    @Test
    public void sendHtmlMail() throws MessagingException {

        String content = "<html>\n" +
                "<body>\n" +
                "<h3>hello world</h3>\n" +
                "<h1>html</h1>\n" +
                "<body>\n" +
                "</html>\n";

        mailService.sendHtmlMail("wufagang@dhcc.com.cn","这是一封HTML邮件",content);
    }

    @Test
    public void sendAttachmentsMail() throws MessagingException {
        String filePath = "D:\\projects\\20200727\\ecs\\src\\main\\resources\\system.properties";
        String content = "<html>\n" +
                "<body>\n" +
                "<h3>hello world</h3>\n" +
                "<h1>html</h1>\n" +
                "<h1>附件传输</h1>\n" +
                "<body>\n" +
                "</html>\n";
        mailService.sendAttachmentsMail("wufagang@dhcc.com.cn","这是一封HTML邮件",content, filePath);
    }

    @Test
    public void sendInlinkResourceMail() throws MessagingException {
        //TODO 改为本地图片目录
        String imgPath = "D:\\projects\\20200727\\ecs\\src\\main\\resources\\imag\\IMG_20200625_104833.jpg";
        String rscId = "admxj001";
        String content = "<html>" +
                "<body>" +
                "<h3>hello world</h3>" +
                "<h1>html</h1>" +
                "<h1>图片邮件</h1>" +
                "<img src='cid:"+rscId+"'></img>" +
                "<body>" +
                "</html>";

        mailService.sendInlinkResourceMail("wufagang@dhcc.com.cn","这是一封图片邮件",content, imgPath, rscId);
    }

    @Test
    public void testTemplateMailTest() throws MessagingException {
//        Context context = new Context();
//        context.setVariable("id","ispringboot");
//
//        String emailContent = templateEngine.process("emailTeplate", context);
//        mailService.sendHtmlMail("ispringboot@163.com","这是一封HTML模板邮件",emailContent);

    }
}
相关推荐
方圆想当图灵12 分钟前
缓存之美:万文详解 Caffeine 实现原理(下)
java·redis·缓存
栗豆包27 分钟前
w175基于springboot的图书管理系统的设计与实现
java·spring boot·后端·spring·tomcat
等一场春雨1 小时前
Java设计模式 十四 行为型模式 (Behavioral Patterns)
java·开发语言·设计模式
萧若岚1 小时前
Elixir语言的Web开发
开发语言·后端·golang
Channing Lewis2 小时前
flask实现重启后需要重新输入用户名而避免浏览器使用之前已经记录的用户名
后端·python·flask
Channing Lewis2 小时前
如何在 Flask 中实现用户认证?
后端·python·flask
酱学编程2 小时前
java中的单元测试的使用以及原理
java·单元测试·log4j
我的运维人生2 小时前
Java并发编程深度解析:从理论到实践
java·开发语言·python·运维开发·技术共享
一只爱吃“兔子”的“胡萝卜”2 小时前
2.Spring-AOP
java·后端·spring
HappyAcmen2 小时前
Java中List集合的面试试题及答案解析
java·面试·list