gpt4 book ai didi

java - MimeMessage.saveChanges 真的很慢

转载 作者:行者123 更新时间:2023-11-29 06:52:09 28 4
gpt4 key购买 nike

由于包含 m.saveChanges(),以下测试执行大约需要 5 秒。

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());

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

最佳答案

修复 most common mistakes people make when using JavaMail首先在您的代码中。

DNS lookup可能会损害某些机器的性能。对于 JDK,您可以更改缓存 DNS 查找的安全属性 networkaddress.cache.ttl and networkaddress.cache.negative.ttl或设置系统属性 sun.net.inetaddr.ttl and sun.net.inetaddr.negative.ttl . JDK 7 及更高版本中的默认行为在缓存方面做得很好,因此您不必更改这些设置。

最好,您可以使用 session 属性来避免这些查找。

  1. mail.from or mail.host 添加 session 属性(这些确切的键名)因为任何一个属性都会阻止在 InternetAddress.getLocalAddress(Session) 中进行名称查找.这些属性可以附加或不附加它们的对应属性来设置,这些属性在 key 名称中包含协议(protocol)(稍后会详细介绍)。这些属性将提高 MimeMessage.saveChanges() 的性能, MimeMessage.updateHeaders() , MimeMessage.updateMessageID() , 和 MimeMessage.setFrom()全部调用 InternetAddress::getLocalAddress。如果未设置上述属性,则此方法将尝试查询主机名。通过设置属性,此方法将从 session 中提取主机名字符串,而不是尝试进行昂贵的 DNS 查找。
  2. mail.smtp.localhost or mail.smtps.localhost 设置 session 属性以防止在传输过程中对 HELO 命令进行名称查找。
  3. mail.smtp.from or mail.smtps.from 设置 session 属性防止在传输过程中查找 EHLO 命令。
  4. 或者,您可以设置系统属性 mail.mime.address.usecanonicalhostname如果您的代码依赖于 setFrom(),则为 false但如果您应用第 1 点,这将得到处理。
  5. 对于IMAP,你可以尝试设置mail.imap.sasl.usecanonicalhostname or mail.imaps.sasl.usecanonicalhostname为默认值 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 地址。

关于java - MimeMessage.saveChanges 真的很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44435457/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com