Quarkus集成Vert.x Mailer保活超时触发Connection Reset问题咨询
根因分析
该报错是Exchange Online(Office 365 SMTP服务)的服务端特性与客户端配置不匹配导致的:
- 微软官方限制了SMTP端点的空闲连接最大存活时间,该阈值短于你配置的60秒客户端keep-alive超时。服务端会在客户端还未触发空闲连接优雅关闭逻辑时,主动发送RST包断开连接
- 此时Vert.x Mailer的连接池仍认为该连接处于存活状态,触发读操作时就会捕获到连接重置异常,这并不是优雅关闭逻辑存在缺陷,而是两端超时设置的时间差导致的时序问题
可行解决方案
方案1:调低客户端空闲连接超时时间(最优方案)
将客户端keep-alive超时调整为低于服务端阈值即可,通用配置为30秒,保证客户端先于服务端主动优雅关闭连接,从根源避免报错,同时保留连接复用能力:
quarkus.mailer.host=smtp.office365.com quarkus.mailer.keep-alive=true quarkus.mailer.keep-alive-timeout=PT30S
方案2:关闭长连接复用
如果你的业务场景邮件发送频率较低,不需要连接复用能力,可以直接关闭keep-alive,每次发送邮件新建独立连接,发送完成后立即销毁,不会产生空闲连接相关报错:
quarkus.mailer.keep-alive=false
方案3:调整日志级别(仅作临时兜底,不推荐)
如果受业务限制无法调整上述配置,可以临时将io.vertx.ext.mail.impl.SMTPConnection类的日志级别调整为WARN或OFF,屏蔽错误日志输出。该方案仅做表层处理,不会解决连接被重置的本质问题。
内容的提问来源于stack exchange,提问作者Marvin
相关产品推荐
相关产品推荐

