2017-06-08 44 views
1

m.saveChanges()が含まれているため、次のテストには約5秒かかります。MimeMessage.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 s = mock(Session.class); 
when(s.getProperties()).thenReturn(new Properties()); 

がここでの問題は何ですか?物事をスピードアップするにはどうすればいいですか?

答えて

4

コードの最初に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以降のデフォルトの動作では、キャッシュがうまく機能します。

これらのルックアップの一部を避けるために、セッションプロパティを使用することをお勧めします。

  1. mail.smtp.localhostのセッションプロパティを設定して、HELOコマンドで名前を参照しないようにします。
  2. プロトコルのバージョンではなくmail.from or mail.hostのセッションプロパティを設定すると、InternetAddress.getLocalAddress(Session)の名前参照ができなくなります。 MimeMessage.saveChanges()MimeMessage.updateHeaders()MimeMessage.updateMessageID()、またはMimeMessage.setFrom()を呼び出すと、このメソッドがトリガされます。
  3. mail.smtp.fromのセッションプロパティを設定して、EHLOコマンドのルックアップを防止します。
  4. また、コードがsetFrom()に依存している場合は、mail.mime.address.usecanonicalhostnamefalseに設定できますが、これはポイント#2で処理する必要があります。
  5. IMAPの場合、デフォルト値のmail.imap.sasl.usecanonicalhostnamefalseに設定することができます。

あなたがメッセージを輸送のために、コードを変更することで、ルール#2を適用していないので:あなたがメッセージを輸送している場合は、ルール#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"); 
} 

、#2、#3名前検索のためにホストシステムにアクセスすることを防ぎます。トランスポート中にすべてのDNSルックアップを防止する場合は、IPアドレスを使用する必要があります。

関連する問題