SpringBoot通过计划任务发送邮件提醒的代码详解

 更新时间:2024年11月18日 09:18:36   作者:_童年的回忆_  
在实际线上项目中,有不断接受到推送方发来的数据场景,而且是不间断的发送,如果忽然间断了,应该是出问题了,需要及时检查原因,这种情况比较适合用计划任务做检查判断,出问题发邮件提醒,本文给大家介绍了SpringBoot通过计划任务发送邮件提醒,需要的朋友可以参考下

概要

在实际线上项目中,有不断接受到推送方发来的数据场景,而且是不间断的发送。如果忽然间断了,应该是出问题了,需要及时检查原因,这种情况比较适合用计划任务做检查判断,出问题发邮件提醒。

技术细节

邮件发送使用spring的JavaMailSender,先添加pom依赖:

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

接着配置application.yml,指定发送邮箱,本文使用的是zoho邮箱:

spring:
  mail:
    host: smtp.zoho.com
    username: noreply@xxx.top
    password: xxxxxx
    port: 465
    protocol: smtp
    default-encoding: utf-8
    properties:
      mail:
        smtp:
          auth: true
          starttls:
            enable: true
            required: true
          ssl:
            enable: true
          socketFactory:
            port: 465
            class: javax.net.ssl.SSLSocketFactory

然后在service层新增发送邮件的方法:

    @Autowired
    private JavaMailSender javaMailSender;
    @Override
    public void sendWarningMail(String to, String datetime) {
        String content = "xxxx已经有半个小时没有获取到推送数据了,检测时间: <span style='color: red;'>" + datetime + "</span>。";
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        try {
            MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage,true);
            mimeMessageHelper.setTo(to);
            mimeMessageHelper.setFrom("noreply@xxxx.top");
            mimeMessageHelper.setText(content,true);
            mimeMessageHelper.setSubject("xxxx-预警提醒");
            javaMailSender.send(mimeMessage);
        } catch (MessagingException e) {
            System.out.println(e.getMessage());
        }
    }

邮件发送就完成了,接下来配置计划任务:

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import com.yunheng.pricepush.domain.ToutiaoPush;
import com.yunheng.pricepush.service.ToutiaoPushService;
import com.yunheng.pricepush.utility.RedisUtils;
import com.yunheng.pricepush.utility.SpringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

@Component
@Slf4j
@EnableScheduling
public class QSConsumer
{
    private RedisUtils redisUtils() {
        return SpringUtils.getBean(RedisUtils.class);//SpringUtils与RedisUtils上一篇博文有介绍
    }
    @Autowired
    private ToutiaoPushService toutiaoPushService;

    @Async("priceExecutor")
    @Scheduled(fixedDelay = 60000) //1分钟执行一次
    public void checkTask() {
        Date d = new Date();
        SimpleDateFormat hour = new SimpleDateFormat("HH");
        int h = Integer.parseInt(hour.format(d));
        if(h < 8) return;//晚上12点到早晨8点不检查
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        long timestamp = new Date().getTime() / 1000;//抓取最近半个小时内的数据
        List<ToutiaoPush> list = toutiaoPushService.findByTimestamp(timestamp - (60*30));
        if(list.isEmpty()) {
            toutiaoPushService.sendWarningMail("xxx@163.com", sdf.format(d));//发送给运维
            return;
        }
        System.out.println("半个小时之内,共入库:"+list.size()+"条数据, 监测时间:"+sdf.format(d));
    }
}

Application入口类:

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.context.ApplicationContext;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling
@ServletComponentScan
@MapperScan("com.yunheng.pricepush.mapper")
@EnableAsync(proxyTargetClass = true)//打开异步任务开关
public class PromotionApplication {

    public static void main(String[] args) {
        final ApplicationContext applicationContext = SpringApplication.run(PromotionApplication.class, args);
    }
}

小结

这样就达到了计划任务检查的效果,还是比较实用的。

到此这篇关于SpringBoot通过计划任务发送邮件提醒的代码详解的文章就介绍到这了,更多相关SpringBoot发送邮件提醒内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解决maven常见错误:Dependency is duplicated in file(s):

    解决maven常见错误:Dependency is duplicated in 

    这篇文章主要介绍了解决maven常见错误:Dependency is duplicated in file(s):问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • SpringBoot缓存Ehcache的使用详解

    SpringBoot缓存Ehcache的使用详解

    EhCache、Redis比较常用,使用Redis的时候需要先安装Redis服务器,本文给大家介绍SpringBoot缓存Ehcache的使用详解,感兴趣的朋友跟随小编一起看看吧
    2022-03-03
  • SpringBoot集成P6spy实现自定义SQL日志打印

    SpringBoot集成P6spy实现自定义SQL日志打印

    本文主要介绍了SpringBoot集成P6spy实现自定义SQL日志打印,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • Spring 使用 feign时设置header信息的操作

    Spring 使用 feign时设置header信息的操作

    这篇文章主要介绍了Spring 使用 feign时设置header信息的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • java构建OAuth2授权服务器

    java构建OAuth2授权服务器

    本文主要介绍了java构建OAuth2授权服务器,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2021-07-07
  • java解析xml的4种方式的优缺点对比及实现详解

    java解析xml的4种方式的优缺点对比及实现详解

    这篇文章主要介绍了java解析xml的4种方式的优缺点对比及实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • 分布式调度器之Spring Task 的使用详解

    分布式调度器之Spring Task 的使用详解

    SpringTask是Spring框架中用于任务调度的组件,通过简单的注解就能实现定时任务的创建和调度,可以通过配置线程池来实现,本文给大家介绍分布式调度器之Spring Task 的使用,感兴趣的朋友跟随小编一起看看吧
    2024-10-10
  • Java中异常Exception和捕获以及自定义异常详解

    Java中异常Exception和捕获以及自定义异常详解

    在工作过程中,我们常常需要在合适的地方抛出合适的异常,除了java自带的一些异常,我们可以在项目中定制自己的异常,并且全局捕获它,下面这篇文章主要给大家介绍了关于Java中异常Exception和捕获以及自定义异常的相关资料,需要的朋友可以参考下
    2023-05-05
  • Java 9中如何对IntegerCache进行修改详解

    Java 9中如何对IntegerCache进行修改详解

    这篇文章主要给大家介绍了关于Java 9中如何对IntegerCache进行修改的相关资料,文中通过示例代码介绍的非常详细,对大家学习或使用java9具有一定的参考学习价值,需要的朋友们下面随着小编来一起看看吧。
    2017-12-12
  • Java算法实战之排一亿个随机数

    Java算法实战之排一亿个随机数

    我们在生活中经常遇见一些这样的需求,随机点名、公司年会抽奖、微信拼手气红包等,还有一些游戏比如打地鼠小游戏、俄罗斯方块等,这些场景中都会用到一种算法:随机,这篇文章主要给大家介绍了关于Java算法实战之排一亿个随机数的相关资料,需要的朋友可以参考下
    2021-11-11

最新评论