MimeMessage.saveChanges 真的很慢

2024-04-06

由于包含以下内容,以下测试的执行时间约为 5 秒m.saveChanges().

import org.junit.Before;
import org.junit.Test;    
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.internet.MimeMessage;
import java.io.IOException;
import java.util.Properties;
import static org.junit.Assert.assertEquals;   
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

@Test
public void test1() throws MessagingException, IOException {
    Session s = Session.getDefaultInstance(new Properties());
    MimeMessage m = new MimeMessage(s);
    m.setContent("<b>Hello</b>", "text/html; charset=utf-8");
    m.saveChanges();
    assertEquals(m.getContent(), "<b>Hello</b>");
    assertEquals(m.getContentType(), "text/html; charset=utf-8");
}

我还用mockito嘲笑了Session,但这没有帮助:

Session s = mock(Session.class);
when(s.getProperties()).thenReturn(new Properties());

这里有什么问题?我可以模拟什么来加快速度?


Fix the 人们在使用 JavaMail 时最常犯的错误 https://javaee.github.io/javamail/FAQ#commonmistakes首先在你的代码中。

DNS查询 https://docs.oracle.com/javase/8/docs/api/java/net/InetAddress.html#getCanonicalHostName--可能会损害某些机器的性能。对于 JDK,您可以更改缓存 DNS 查找的安全属性networkaddress.cache.ttl and networkaddress.cache.negative.ttl https://docs.oracle.com/javase/8/docs/technotes/guides/net/properties.html或设置系统属性sun.net.inetaddr.ttl and sun.net.inetaddr.negative.ttl https://docs.oracle.com/javase/8/docs/technotes/guides/net/properties.html。 JDK 7 及更高版本中的默认行为可以很好地进行缓存,因此您不必更改这些设置。

最好,您可以使用会话属性来避免某些此类查找。

  1. 添加会话属性mail.from or mail.host https://javaee.github.io/javamail/docs/api/(这些确切的键名称),因为任一属性都会阻止在其中进行名称查找InternetAddress.getLocalAddress(Session) https://javaee.github.io/javamail/docs/api/javax/mail/internet/InternetAddress.html#getLocalAddress-javax.mail.Session-。这些属性可以在其对应属性的基础上进行设置,也可以不进行设置,这些属性在键名中包含协议(稍后会详细介绍)。这些属性将提高性能MimeMessage.saveChanges() https://javaee.github.io/javamail/docs/api/javax/mail/internet/MimeMessage.html#saveChanges--, MimeMessage.updateHeaders() https://javaee.github.io/javamail/docs/api/javax/mail/internet/MimeMessage.html#updateHeaders--, MimeMessage.updateMessageID() https://javaee.github.io/javamail/docs/api/javax/mail/internet/MimeMessage.html#updateMessageID--, and MimeMessage.setFrom() https://javaee.github.io/javamail/docs/api/javax/mail/internet/MimeMessage.html#setFrom--都叫InternetAddress::getLocalAddress。如果未设置上述属性,则此方法将尝试查询主机名。通过设置属性,此方法将从会话中提取主机名字符串,而不是尝试昂贵的 DNS 查找。
  2. 设置会话属性mail.smtp.localhost or mail.smtps.localhost https://javaee.github.io/javamail/docs/api/com/sun/mail/smtp/package-summary.html以防止在传输时使用 HELO 命令进行名称查找。
  3. 设置会话属性mail.smtp.from or mail.smtps.from https://javaee.github.io/javamail/docs/api/com/sun/mail/smtp/SMTPTransport.html#ehlo-java.lang.String-以防止在传输时查找 EHLO 命令。
  4. 或者,您可以设置系统属性mail.mime.address.usecanonicalhostname https://javaee.github.io/javamail/docs/api/javax/mail/internet/package-summary.html to false如果你的代码依赖于setFrom() https://javaee.github.io/javamail/docs/api/javax/mail/internet/MimeMessage.html#setFrom--但如果您应用了第 1 点,就会处理这个问题。
  5. 对于 IMAP,您可以尝试设置mail.imap.sasl.usecanonicalhostname or mail.imaps.sasl.usecanonicalhostname https://javaee.github.io/javamail/docs/api/com/sun/mail/imap/package-summary.html to false这是默认值。

由于您没有传输消息,因此请通过将代码更改为以下内容来应用规则#1:

@Test
public void test1() throws MessagingException, IOException {
    Properties props = new Properties();
    props.put("mail.host", "localhost"); //Or use IP.
    Session s = Session.getInstance(props);
    MimeMessage m = new MimeMessage(s);
    m.setContent("<b>Hello</b>", "text/html; charset=utf-8");
    m.saveChanges();
    assertEquals(m.getContent(), "<b>Hello</b>");
    assertEquals(m.getContentType(), "text/html; charset=utf-8");
}

如果您正在传输消息,则结合规则#1、#2 和#3,这将阻止访问主机系统进行名称查找。如果您想阻止传输期间的所有 DNS 查找,则必须使用 IP 地址。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MimeMessage.saveChanges 真的很慢 的相关文章

  • 使用 Ant 将非代码资源添加到 jar 文件

    我正在将 java 应用程序打包成 jar 文件 我正在使用 ant 和 eclipse 我实际上需要在 jar 中直接在根文件夹下包含几个单独的非代码文件 xml 和 txt 文件 而不是与代码位于同一位置 我正在尝试使用includes
  • Java:在 eclipse 中导出到 .jar 文件

    我正在尝试将 Eclipse 中的程序导出到 jar 文件 在我的项目中 我添加了一些图片和 PDF s 当我导出到 jar 文件时 似乎只有main已编译并导出 我的意愿是如果可能的话将所有内容导出到 jar 文件 因为这样我想将其转换为
  • Spring Data JPA 选择不同

    我有一个情况 我需要建立一个select distinct a address from Person a 其中地址是 Person 内的地址实体 类型的查询 我正在使用规范动态构建我的 where 子句并使用findAll Specifi
  • 在 Wildfly 中与 war 部署共享 util jar 文件

    假设我有一个名为 util jar 的 jar 文件 该 jar 文件主要包含 JPA 实体和一些 util 类 无 EJB 如何使这个 jar 可用于 Wildfly 中部署的所有 war 无需将 jar 放置在 war 的 WEB IN
  • 大数据使用什么数据结构

    我有一个包含一百万行的 Excel 工作表 每行有 100 列 每行代表一个具有 100 个属性的类的实例 列值是这些属性的值 哪种数据结构最适合在这里使用来存储数百万个数据实例 Thanks 这实际上取决于您需要如何访问这些数据以及您想要
  • Kotlin 未解决的参考:CLI 上 gradle 的 println

    放一个printlnkotlin 函数返回之前的语句会崩溃 堆栈跟踪 thufir dur NetBeansProjects kotlin thufir dur NetBeansProjects kotlin gradle clean bu
  • 当客户端关闭连接时,Spring StreamingResponseBody 请求线程未清理

    我在控制器中有一个端点 它返回一个StreamingResponseBody 用于向客户端发送文件 其代码大致如下 RestController RequestMapping value api public class Controlle
  • 来自十六进制代码的 Apache POI XSSFColor

    我想将单元格的前景色设置为十六进制代码中的给定颜色 例如 当我尝试将其设置为红色时 style setFillForegroundColor new XSSFColor Color decode FF0000 getIndexed 无论我在
  • ConcurrentHashMap 内部是如何工作的?

    我正在阅读有关 Java 并发性的 Oracle 官方文档 我想知道Collection由返回 public static
  • 需要使用 joda 进行灵活的日期时间转换

    我想使用 joda 解析电子邮件中的日期时间字符串 不幸的是我得到了各种不同的格式 例如 Wed 19 Jan 2011 12 52 31 0600 Wed 19 Jan 2011 10 15 34 0800 PST Wed 19 Jan
  • 如何使用 Hibernate (EntityManager) 或 JPA 调用 Oracle 函数或过程

    我有一个返回 sys refcursor 的 Oracle 函数 当我使用 Hibernate 调用该函数时 出现以下异常 Hibernate call my function org hibernate exception Generic
  • 如何检测 Java 字符串中的 unicode 字符?

    假设我有一个包含 的字符串 我如何找到所有这些 un icode 字符 我应该测试他们的代码吗 我该怎么做呢 例如 给定字符串 A X 我想将其转换为 AYXY 我想对其他 unicode 字符做同样的事情 并且我不想将它们存储在某种翻译映
  • Java Swing For mac 中的 DJ Native Swing 浏览器

    我有一个用 Swing 制作的 Java 应用程序 并且使用了一个 DJ Native Swing 浏览器 当我尝试在 OS X 上使用它时 它抛出了一个NoClassDefFoundError尽管我添加了 swt jar 但始终如此 有人
  • 如何避免 ArrayIndexOutOfBoundsException 或 IndexOutOfBoundsException? [复制]

    这个问题在这里已经有答案了 如果你的问题是我得到了java lang ArrayIndexOutOfBoundsException在我的代码中 我不明白为什么会发生这种情况 这意味着什么以及如何避免它 这应该是最全面的典范 https me
  • 返回 Java 8 中的通用函数接口

    我想写一种函数工厂 它应该是一个函数 以不同的策略作为参数调用一次 它应该返回一个函数 该函数根据参数选择其中一种策略 该参数将由谓词实现 嗯 最好看看condition3为了更好的理解 问题是 它没有编译 我认为因为编译器无法弄清楚函数式
  • JMenu 中的文本居中

    好吧 我一直在网上寻找有关此问题的帮助 但我尝试的任何方法似乎都不起作用 我想让所有菜单文本都集中在菜单按钮上 当我使用setHorizontalTextPosition JMenu CENTER 没有变化 事实上 无论我使用什么常量 菜单
  • 是否可以使用 Java Guava 将函数应用于集合?

    我想使用 Guava 将函数应用于集合 地图等 基本上 我需要调整 a 的行和列的大小Table分别使所有行和列的大小相同 执行如下操作 Table
  • Hamcrest Matchers - 断言列表类型

    问题 我目前正在尝试使用 Hamcrest Matchers 来断言返回的列表类型是特定类型 例如 假设我的服务调用返回以下列表 List
  • Resteasy 可以查看 JAX-RS 方法的参数类型吗?

    我们使用 Resteasy 3 0 9 作为 JAX RS Web 服务 最近切换到 3 0 19 我们开始看到很多RESTEASY002142 Multiple resource methods match request警告 例如 我们
  • 洪水填充优化:尝试使用队列

    我正在尝试创建一种填充方法 该方法采用用户指定的初始坐标 检查字符 然后根据需要更改它 这样做之后 它会检查相邻的方块并重复该过程 经过一番研究 我遇到了洪水填充算法并尝试了该算法 它可以工作 但无法满足我对 250 x 250 个字符的数

随机推荐

  • 主管不使用 Gunicorn + Flask

    我正在尝试在 Ubuntu 12 04 系统中从 Supervisor 运行 Gunicorn Gunicorn 运行 Flask 应用程序 使用 Flask 的嵌入式服务器测试的简单 REST Web 服务 我通过克隆 GIT 存储库来安
  • React 项目中 Bootstrap 需要 jQuery

    我正在开发一个 React js 项目 我不使用 React Bootstrap 而是将 Bootstrap 的 CSS 加载到我的项目中 我现在需要导入 jQuery 以便我可以使用下拉菜单等 入口点文件 index js 希望它能起作用
  • Pip“找不到满足 pygame 要求的版本”[重复]

    这个问题在这里已经有答案了 当我尝试使用以下命令安装 PyGame 时 pip install pygame it says 收集pygame 找不到满足要求的版本 要求 pygame 来自版本 未找到匹配的分布 我相信我使用的是最新版本
  • 在 Cygwin 中从源代码构建 Vim

    我正在尝试在 Cygwin 下从源代码包构建 Vim 以启用 Python 支持 我正在按照给出的指示进行操作here http cygwin com ml cygwin 2004 06 msg00540 html 但是当我运行时遇到这个错
  • 在测试台中显示信号名称/文字

    是否可以在 Verilog 中引用 显示信号的名称 文字 对于在 Verilog 测试台中创建通用信号检查功能来说 这将是一个有用的功能 我知道使用 display 时 m 将打印信号的范围 是否有显示信号名称的等效项 在 Verilog
  • C++11 future.wait_for() 始终返回 future_status::timeout

    我有一个 C 11 程序 用于检查数字是否为素数 程序等待有一个 future 对象准备好 准备好后 程序会告诉 future 对象的提供者函数是否认为该数字是素数 future example include
  • 如何在 Cython 的 setup.py 中指定 Python 3 源?

    我正在尝试按照本教程在 Cython 中执行 Hello World 程序http docs cython org src tutorial cython tutorial html cython hello world http docs
  • 如何使用 matplotlib 显示两个图形?

    我在同时绘制两个图形时遇到一些麻烦 未在单个图中显示 但根据文档 我写了代码 只有图一显示 我想也许我失去了一些重要的东西 有人能帮我弄清楚吗 谢谢 代码中使用的 tlist first 是数据列表 plt figure 1 plt his
  • 初始化 C 结构的双花括号的含义是什么?

    我目前正在处理遗产C 代码 用gcc 2 9 X成功编译 我被要求将此遗留代码移植到 gcc 3 4 X 大多数错误都很容易纠正 但这个特殊的错误让我感到困惑 上下文 struct TMessage THeader header TData
  • C# 程序员的 C++ [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我对 Java 和 C 的 OO 有很好的理解 而且我很幸运在我的工程课程中接触到了汇编程序和 C 的
  • 控制器中的@Transactional

    首先我想说 我完全同意只让服务层具有事务性 但有时世界并不完美 而现在我正处于这种情况之中 基本上我被分配到一个很棒的项目 遗留代码已经有 4 年多了 问题是 开发人员没有遵循任何引入业务逻辑的模式 因此您可以对来自控制器的多个服务调用进行
  • Tomcat 7 连接被拒绝

    我有一个在 Jelastic 上运行的 Tomcat 实例 并且有两个已部署的应用程序 用于 foo 上下文和 bar 上下文 在处理对 foo 的请求期间 我们向 bar 发出 HTTP 请求 用于授权 并且这里总是出现异常 Connec
  • 如何使用 Castle Core 或其他库(只是免费库)编写拦截器(AOP)以解决交叉问题

    我想要一个像这样的属性来处理横切关注点 例如 Logging Exception public class MyService Log Interception AOP ExceptionHandler Interception AOP p
  • 如何通过 CLI 快速重命名 macOS 或 Linux 上的文件?

    这是我的源文件 e2f9eb91 645f 408a 9241 66490b61a617 file module 1 txt d20f06a8 4de1 4da0 8175 93e9b2d81c42 file module 2 txt 67
  • 在 Windows 7 上通过 VPN 使用时 Git 无响应

    这是关于通过 VPN 处理本地存储库时简单 git 命令无响应的问题 我的 Windows 用户帐户 管理员角色 是我用来登录的域帐户 我有一些从 github 源克隆的本地存储库 场景 1 在没有 VPN 的 Windows 上使用本地存
  • xamarin.forms 处理 WebView 上的 Clicked 事件

    我想处理 WebView 控件上的单击 点击事件 我已经尝试过 GestureRecognizers 但没有任何反应 我认为 WebView 可能有某种方式使事件处理为 true
  • 设置 Angular-UI Select2 多重指令的初始值

    我有一个 select2 指令 用于多个选择的国家 地区 并使用自定义查询来获取数据 Directive
  • PHP 使用 sqlsrv 一次检索多行流内容

    这是一种后续行动这个问题 https stackoverflow com questions 67998821 create file system file from file stored in microsoft sql databa
  • 检查视频是否正在流式传输

    我有这个流来自http www tpai tv live http www tpai tv live但正如您现在所看到的 它已关闭 我需要检查流是否正在播放 如果不播放其他内容 这是流式传输代码
  • MimeMessage.saveChanges 真的很慢

    由于包含以下内容 以下测试的执行时间约为 5 秒m saveChanges import org junit Before import org junit Test import javax mail MessagingException