背景
邮件使用的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)
方法
打开代码瞅一瞅
发现
- 卡在了send方法
-
用了一个系统默认的异步线程池
- 使用的Ofiice365邮箱,会有一些限流的策略,当邮件发送的太多会卡住了,并且不会报错,线程也没被杀死就这么卡在这里。
- 用的默认的线程池,只有8个核心线程,当8个线程都被卡住的时候,邮件再也发送不出去了。
解决过程
- 立马重启
- 增加邮件发送配置,配置超时时间
spring.mail.properties.mail.smtp.writetimeout=10000
spring.mail.properties.mail.smtp.timeout=10000
spring.mail.properties.mail.smtp.connectiontimeout=10000
- 修改线程池,改成自定义的线程池,不要使用系统默认的
版权声明:本文为axiang_原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。