在项目中使用 JavaMail 作为邮件核心库,但是一直遇到一个比较头疼的问题,当邮件中存在附件时,此封邮件加载速度很慢,最高时之后 80k/s.
通过 log 打印看出,当获取附件时,获取一段之后等待一段时间在获取另一端.导致 io 开销过大,等待网络读取时间过长.
相关日志如下:
O24 FETCH 276 (BODY[1.2]<229376.16384>)
- 276 FETCH (BODY[1.2]<229376> {16384}
O24 OK Fetch completed
O25 FETCH 276 (BODY[1.2]<245760.16384>)
- 276 FETCH (BODY[1.2]<245760> {16384}
O25 OK Fetch completed
根据此现象大概能够判断到问题就是分段下载导致的.经过一番苦苦查找.功夫不负有心人,在JavaMail API 的文档的 imap 下面中找到这么一个配置
mail.imap.partialfetch boolean Controls whether the IMAP partial-fetch capability should be used. Defaults to true.
说是否开启 IMAP 的分段加载功能,并且默认是开启的.
在 Properties 中设置此配置为 false.
在进行打开此封邮件的 24M 附件,加载速度控制在了 30s 左右,对比之前的接近 30 分钟,算是几乎解决了这个问题.
这个配置只有在超大附件时效果及其明显,附件在 100k,以下是效果几乎不明显.
文档连接: https://javaee.github.io/javamail/docs/api/com/sun/mail/imap/package-summary.html