JavamailのAuthenticationFailedException異常


Javamail受信pop 3プロトコルでメールを受信する場合、Authenicationクラスを作成してユーザー検証情報を保存できます.
 
public class MyAuthenticator extends Authenticator {
		private String strUser;
		private String strPswd;

		/**
		 * Initial the authentication parameters.
		 * 
		 * @param username
		 * @param password
		 */
		public MyAuthenticator(String username, String password) {
			this.strUser = username;
			this.strPswd = password;
		}

		/**
		 * @return
		 */
		protected PasswordAuthentication getPasswordAuthentication() {
			return new PasswordAuthentication(strUser, strPswd);
		}
	}
 
次にセッションでこのクラスのインスタンスを使用します
		Properties props = null;
		Session session = null;

		props = System.getProperties();
		props.put("mail.pop3.host", host);
		props.put("mail.pop3.auth", "true");
		props.put("mail.pop3.port", port);
		Authenticator auth = new MyAuthenticator(userName, password);
		session = Session.getDefaultInstance(props, auth);

		Store store = session.getStore("pop3");

		store.connect();
                ...
 
これにより、MyAuthenticatorを使用してユーザーの認証情報を保存できます.
 
単一のスレッドを使用して実行する場合、上記のコードは正しく実行されるかもしれませんが、マルチスレッド環境では、このコードがAuthenticatioinFailedExceptionを引き起こす可能性があります.
 
なぜならsessionとpropsは独立したインスタンスではなく、マルチスレッドの場合に相互に影響し合い、特に異なるPOP 3サーバを読み出す場合に
 
この時、2段目のコードをいくつか変更する必要があります.
		Properties props = null;
		Session session = null;

//		props = System.getProperties();
		props = new Properties();
		props.put("mail.pop3.host", host);
		props.put("mail.pop3.auth", "true");
		props.put("mail.pop3.port", port);
		Authenticator auth = new MyAuthenticator(userName, password);
//		session = Session.getDefaultInstance(props, auth);
		session = Session.getInstance(props, auth);

		Store store = session.getStore("pop3");

		store.connect();

                ...
 
新プロパティ()およびセッションgetInstance(props,auth)は、各スレッド間のインスタンスが独立していることを保証し、マルチスレッド実行環境でリソースが衝突しないことを保証し、AutheticationFailedExceptionの発生を回避します.
 
(指摘と補足を歓迎)