2010-12-02 10 views
13

私のアプリケーションは随時メールを送信する必要があります。私はjavamailのgetDefaultSessionとgetTransportを使ってメッセージを送信していますが、期待通りに動作しています。javamailセッションのトランスポートを開いたままにしても構いませんか?

しかし、私は送信に長い時間がかかることに気付きました - 送信ごとに最大7秒。私はこのように、手順を打破する場合:

Transport transport = session.getTransport("smtp"); 
transport.connect(); 
transport.sendMessage(msg, addresses) 
transport.close(); 

...私はそれはほとんどすべての時間のかかり、Connect()の呼び出し、毎回だと見ることができます。

私が見つけたすべての例では、トランスポート、接続、送信、切断を行っています。しかしもちろん、それらはすべてシングルショットの例であり、1回の呼び出しで大量の電子メールを送信します。

私はこのように、私はちょうどオープン接続を残すことができることを考えていた:

Transport transport = session.getTransport("smtp"); 
if (!transport.isConnected()) 
    transport.connect(); 
transport.sendMessage(msg, addresses) 

を(ここでは、その上のバリエーションがあります:java mail keeping Transport object connected)。

私は最終的に何らかのシャットダウンフックでそれを閉じなければなりません。そして、私はフォールバックを持たなければならないかもしれません(接続が失われているが、輸送が実現しない場合)。しかし、アプリケーションライフタイムの間にこれを開いたままにしておかない理由は何ですか?

おかげで、 アラステア

答えて

7

は、私は本当にオープン、単一のSMTP接続を維持するのに何の問題が表示されていない、とトランスポートオブジェクトの使用は(JavaMail tutorialを参照)接続の再利用のために推奨されます。

さらに、1つのマネージャインスタンス(つまりシングルトンパターン)に保つように、アプリケーションで1つのsmpt接続(トランスポート経由)を開いて、異なる接続を開いたままにする最終的なコストを避けることをお勧めしますメッセージを送信する必要があるすべてのコンポーネントに対して@Bill Shannon年代(のJavaMailの作者)、ここで答えを1として

+0

こんにちはTomas、ありがとう、私が望んでいたもの。私は実際にはSingleton 'EmailSender'インスタンス内でそれを使用する予定ですので、これはうまくいくはずです。 – Alastair

+0

このアプローチは、私の答え – Yura

2

Threadsafety in Javamail

を輸送するので、メールサーバへの接続を表しており、単一のスレッドのみが一度に接続を使用することができ、トランスポートはスレッドの安全性を維持するために複数のスレッドからのアクセスを同期させますが、実際には単一のスレッドからのみ使用したいと思うでしょう。

あなたが(最近は通常の場合)複数のスレッドから単一Transportインスタンスを使用する予定のであれば、それはビューのパフォーマンスの観点から、実際には非常に悪い考えです。 を使用して、Transportインスタンスのプールを開発するほうがよいでしょう。

+0

で説明されているように、マルチスレッド環境で深刻なパフォーマンスの問題につながる可能性があります誰かがそのようなプールのコード例を必要とする必要があります - ここにコメントを残してくださいと私はそれを – Yura

関連する問題