背景
邮件使用的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 版权协议,转载请附上原文出处链接和本声明。