Java发送邮件必带超时时间配置[通俗易懂]

Java发送邮件必带超时时间配置[通俗易懂]在线上遇到了一个发送邮件的问题,记录一下。 我去DB查了一下近期的邮件发送情况,表示:“看着都挺正常的,线上没有异常的情况。可能邮件在redis里边堆积了,还没消费” 这样做有什么好处?把Redis当做一个消息队列,把请求全部扔到Redis上,这能削峰。机器A/B/C的线程会在…

前言

只有光头才能变强。

文本已收录至我的GitHub仓库,欢迎Star:github.com/ZhongFuChen…

在线上遇到了一个发送邮件的问题,记录一下。

一、先说背景

某一天,小王跟我反馈:“麻烦检查一下线上邮件的发送情况,我这查出来发送失败啦”

我去DB查了一下近期的邮件发送情况,表示:“看着都挺正常的,线上没有异常的情况。可能邮件在redis里边堆积了,还没消费”

select * from email order by id desc limit 100

先来说一下我这边发邮件的大致实现方式:

处理邮件消息的方式

这样做有什么好处?把Redis当做一个消息队列,把请求全部扔到Redis上,这能削峰。机器A/B/C的线程会在一定的间隔内向Redis拉取消息,然后调用邮件接口进行发送。

而我这边会在页面上提供一个功能给业务方查询各类消息是否发送成功,由于发送邮件是一个异步的操作,而前同事在编写的时候又追求实时性

  • 目前的逻辑是:如果push到Redis是成功的,并且Redis里边没有堆积着消息(说明机器A/B/C能及时处理掉这封邮件),那就认为这封邮件发送成功。

PS:(如果系统不存在问题,其实这个实现也是OK的。因为邮件的发送量一般不会太大(Redis不会堆积消息),并且发送邮件的成功率也是挺高的

回到问题上,由于有上面的一个背景,所以我就猜测:是不是小王在查结果时,这封邮件还堆积在Redis上,所以就直接返回失败了。果不其然,我去查了一下Redis,还有200封邮件没消息。

于是我就问小王:“你这发了多少封邮件啊?”小王表示:“20分钟500封,1qps都不到”。我想了一下:“那我们这有四台机器,按道理是不会堆积那么多的”。

于是跑去线上服务器看一下消费的日志,发现只有一台机器在消费Redis的数据。又去看了一下错误的日志是不是有大量的错误信息,并没找到错误的日志…

于是去查了一下机器的监控信息,也没发现异样。那问题就来了:为啥就只有一台机器在消费Redis的消息呢?其他三台机器的日志和监控信息都没异常。

二、解决

从日志和机器的信息都判断不出有什么问题,这时我又想起在Java中的一个命令:jstack

jstack命令主要用来查看Java线程的调用堆栈的,可以用来分析线程问题(如死锁)。

jstack详细用法以及教程:www.cnblogs.com/kongzhongqi…

于是我就去执行了一下jstack命令,在信息中搜了一下”Email”,真被我搜出来了:

发邮件卡住了

那就好办了,只要搜一下:“Java 发送邮箱 线程 阻塞”此类的关键字,应该就有解决方案了。

解决方案

最后,发现是因为在发送邮件的时候没有配置超时时间,导致某些线程在发送邮件的时候阻塞掉了(具体原因不明)

  • mail.smtp.connectiontimeout:连接时间限制,单位毫秒。是关于与邮件服务器建立连接的时间长短的。默认是无限制。
  • mail.smtp.timeout:邮件接收时间限制,单位毫秒。这个是有关邮件接收时间长短。默认是无限制。
  • mail.smtp.writetimeout:邮件发送时间限制,单位毫秒。有关发送邮件时内容上传的时间长短。默认同样是无限制。

最后

乐于输出干货的Java技术公众号:Java3y。公众号内有200多篇原创技术文章、海量视频资源、精美脑图,关注即可获取!

转发到朋友圈是对我最大的支持!

觉得我的文章写得不错,点

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/13256.html

(0)

相关推荐

  • 强弱矩阵组织结构

    强弱矩阵组织结构文章浏览阅读6.5k次。什么是矩阵型组织:职能(前端、后端、驱动、bug处理)划分的纵向领导系统按项目(或产品)划分的横向系统二者相结合,纵横交错,形成了矩阵结构。矩阵型组织优点:把职能分工与组织合作结合起来,从项目(产品)角度出发使各职能

    2023-11-06
    128
  • Python升级版本新特性介绍

    Python升级版本新特性介绍Python作为一门高级编程语言,备受程序员们的喜爱,其简洁、易学、高效的特点在广泛的应用场景中得到了体现。Python的版本更新也一直没有停止。本文将为大家介绍Python升级版本的新特性,包括Python 3.8、Python 3.9和Python 3.10等版本中的新功能、新语法、新模块等,希望对各位开发者有所启发。

    2024-09-16
    29
  • 如果要自学编程,零基础,首先应该学什么_如何自学编程

    如果要自学编程,零基础,首先应该学什么_如何自学编程随着互联网日趋迅猛,编程已经在我们生活当中无处不在了。C++从入门到放弃,C语言从入门到放弃,Java从入门到放弃,Python从入门到放弃…

    2022-12-14
    208
  • SQL 入门教程:创建视图「终于解决」

    SQL 入门教程:创建视图「终于解决」目录汇总:SQL 入门教程:面向萌新小白的零基础入门教程 理解了什么是 视图 以及管理它们的规则和约束后,我们来创建视图。 视图用 CREATE VIEW 语句来创建。与 CREATE TABLE 一

    2023-04-21
    160
  • Python 3.7 安装教程

    Python 3.7 安装教程Python是一门高级编程语言,由于其简单易学、拥有丰富的第三方模块以及广泛应用于数据科学、Web开发等领域中,越来越受到了许多人的青睐。Python 3.7是Python编程语言的最新版本,Python 3.7拥有MD5密码改进、新的内存管理工具和各种其它改进。而如何安装Python 3.7成了初学者们所关心的问题。

    2024-04-19
    74
  • ClickHouse源码笔记1:聚合函数的实现

    ClickHouse源码笔记1:聚合函数的实现由于工作的需求,后续笔者工作需要和开源的OLAP数据库ClickHouse打交道。ClickHouse是Yandex在2016年6月15日开源了一个分析型数据库,以强悍的单机处理能力被称道。 笔者在实

    2023-03-07
    153
  • Python判断数据类型

    Python判断数据类型在Python中,了解变量的数据类型是非常重要的。 该信息对于理解代码的执行过程以及预测代码的输出结果都十分有用。 Python有很多内置方法可以帮助我们识别数据类型。 然而,正确使用这些工具需要熟悉它们的使用方法和限制。以下将详细介绍Python判断不同数据类型的方法。

    2024-08-18
    27
  • 「Spark」Spark SQL Thrift Server运行方式

    「Spark」Spark SQL Thrift Server运行方式Spark SQL可以使用JDBC/ODBC或命令行接口充当分布式查询引擎。这种模式,用户或者应用程序可以直接与Spark SQL交互,以运行SQL查询,无需编写任何代码。Spark SQL提供两种方

    2023-01-25
    154

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注