2

メール セッション (javax.mail.Session) をシングルトンに保存することは良い方法ですか? 私と私のチームは、Singleton クラス内の静的変数に 1 つのメール セッションを保持することにしました。

したがって、プライベート コンストラクターでは次のようにします。

try {
        Properties props = new Properties();

        props.put("mail.transport.protocol", config.getMailTransportProtocol());
        props.put("mail.smtp.starttls.enable", config.getMailStarttlsEnable());
        props.put("mail.smtp.host", config.getMailHost());
        props.put("mail.smtp.auth", config.getMailAuth());
        props.put("mail.smtp.user", config.getMailFrom());
        props.put("mail.debug", config.getMailDebug());
        props.put("mail.smtp.port", config.getMailPort());
        props.put("mail.smtp.socketFactory.port", config.getMailPort());
        props.put("mail.smtp.socketFactory.class", config.getMailSocketFactoryClass());
        props.put("mail.smtp.socketFactory.fallback", config.getMailSocketFactoryFallback());

        props.put("mail.pop3.host", config.getMailPop3Host());
        props.put("mail.store.protocol", config.getMailStoreProtocol());

        SimpleAuth auth = new SimpleAuth(config.getMailUser(), config.getMailPass());

        MailSession.session = Session.getDefaultInstance(props, auth);
        session.setDebug(config.getMailDebug());
    } catch (Throwable ex) {
        System.err.println("Initial MailSession creation failed." + ex);
        throw new ExceptionInInitializerError(ex);
    }

でも、このままにしておくのがいいのか、メールごとにセッションを開いたり閉じたりするのがいいのか心配です。

4

2 に答える 2

6

まず、よくある間違いに関する JavaMail FAQ エントリをお読みください。

また、Session.getDefaultInstance メソッドの javadoc を読むと、JavaMail がすでにシングルトン セッションを維持していることがわかります。セッションの構成をまったく変更しない場合は、これでうまくいく可能性がありますが、一般的にはお勧めしません。

于 2012-11-27T20:43:07.080 に答える
0

スレッド間で可変オブジェクトを共有するのは面倒なので、このソリューションには行きたくありません。すぐに構成されたセッションを取得できるメールセッションファクトリの実装を検討してください。これは、メールごとに新しいセッションを使用することを意味するものではありません。メールのバッチを送信する場合は、同じセッションを再利用してメールのバッチを送信できます。

于 2012-11-27T17:10:12.343 に答える