Java系统记一次排查生产环境邮件突然就发不出来的问题

  • Post author:
  • Post category:java


背景

邮件使用的Ofiice365

工单系统,会频繁的发送邮件。

有用户反馈说没有收到邮件,查询了邮件的发送记录,发现从某一天开始,邮件就没有开始发送了。



进入服务器,查看当前的线程状况

[root@prod ~]# jps   // 或者是ps -ef |grep xxx ,找到进程号
17868 Jps
10158 jar
[root@esiteappprd1 ~]# jstack 10158 > info.log // 把信息输出到log里



查看输出的日志

在这里插入图片描述

发现好多线程都在RUNNABLE状态,但是卡在了

MailUtils.sendSimpleEmail(MailUtils.java:61)

方法

打开代码瞅一瞅

发现

  1. 卡在了send方法
  2. 用了一个系统默认的异步线程池

    在这里插入图片描述
  • 使用的Ofiice365邮箱,会有一些限流的策略,当邮件发送的太多会卡住了,并且不会报错,线程也没被杀死就这么卡在这里。
  • 用的默认的线程池,只有8个核心线程,当8个线程都被卡住的时候,邮件再也发送不出去了。



解决过程

  1. 立马重启
  2. 增加邮件发送配置,配置超时时间
spring.mail.properties.mail.smtp.writetimeout=10000
spring.mail.properties.mail.smtp.timeout=10000
spring.mail.properties.mail.smtp.connectiontimeout=10000
  1. 修改线程池,改成自定义的线程池,不要使用系统默认的



版权声明:本文为axiang_原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。