junit MimeMessage.saveChanges非常慢

wnavrhmk  于 2023-01-05  发布在  其他
关注(0)|答案(1)|浏览(171)

由于包含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 s = mock(Session.class);
when(s.getProperties()).thenReturn(new Properties());

有什么问题吗?我该嘲笑什么来加快进度?

myzjeezk

myzjeezk1#

首先修复人们在代码中使用JavaMail时最常犯的错误。
DNS查找可能会影响某些计算机的性能。对于JDK,您可以更改缓存DNS查找networkaddress.cache.ttl and networkaddress.cache.negative.ttl的安全属性,或者设置系统属性sun.net.inetaddr.ttl and sun.net.inetaddr.negative.ttl。JDK 7和更高版本中的默认行为可以很好地进行缓存,因此您不必更改这些设置。
您最好使用会话属性来避免这些查找。
1.添加mail.from or mail.host的会话属性(这些确切的键名),因为任何一个属性都将阻止在InternetAddress.getLocalAddress(Session)内部进行名称查找。这些属性可以在其对应属性(在键名中包含协议)的基础上设置,也可以单独设置这些属性将提高MimeMessage.saveChanges()MimeMessage.updateHeaders()MimeMessage.updateMessageID()、和MimeMessage.setFrom(),它们都调用InternetAddress::getLocalAddress。如果未设置上述属性,则此方法将尝试查询主机名。通过设置属性,此方法将从会话中提取主机名字符串,而不是尝试代价高昂的DNS查找。
1.设置mail.smtp.localhost or mail.smtps.localhost的会话属性,以防止在传输过程中使用HELO命令查找名称。
1.设置mail.smtp.frommail.smtps.from的会话属性,以防止查找传输上的EHLO命令。
1.或者,如果您的代码依赖于setFrom(),则可以将系统属性mail.mime.address.usecanonicalhostname设置为false,但如果应用了第1点,则可以处理此问题。
1.对于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地址。

相关问题