問題が発生するたびに電子メールを送信する必要がある、常に実行されているJavaプログラムがあります。ただし、使用しているメールサーバーがメールの送信時にダウンしている可能性があります。
メールサーバーが復旧したときにメールが確実に配信されるようにするための最良の方法は何ですか?
問題が発生するたびに電子メールを送信する必要がある、常に実行されているJavaプログラムがあります。ただし、使用しているメールサーバーがメールの送信時にダウンしている可能性があります。
メールサーバーが復旧したときにメールが確実に配信されるようにするための最良の方法は何ですか?
リクエストをキューに入れます。何かがキューに入るのを待つだけの別のスレッドを用意してから、それを電子メールで送信しようとします。失敗した場合は、数時間待ってから再試行します。メッセージを送信すると、次のメッセージを取得するためにキューに戻ります。
アプリケーションがクラッシュした場合にこの情報が失われないように、電子メールをファイル(おそらくxmlファイル)に保存することをお勧めします。
このファイルはアプリケーションの起動時に読み込まれ、すべてをメモリに保持するため、保留中のメールがある間は5分ごとにチェックを続け、各メールを送信するときにxmlファイルを再保存します。 10通のうち3通のメールを送信するとクラッシュします。起動時に3通のメールを再送信しません。
しかし、それをどのように処理するかは、実際にはエラー状態を処理する方法の仕様に依存します。
「常にそこにあるこのSMTPサーバーにすべてを転送する」から、後で再試行するなど、通常は完全なSMTPサーバーによって処理されるあらゆる種類の条件を処理する必要がある状況に移行する場合、接続が閉じられた場合は再送信し、MXホストを使用しますそれらの指定された順序と同様に、クライアント内にSMTPサーバーを単純に配置することを検討することをお勧めします(ただし、着信接続を受け入れないサーバー)。これにより、アプリケーションからすべてのダーティロジックが移動します。
James の電子メール サーバー ( http://james.apache.org/ ) は簡単に埋め込むことができると思いますが、実際に試したことはありません。
送信に失敗した場合はメール オブジェクトをスタックまたはリストに入れ、メール サーバーが復旧したら、空になるまで各メールをポップアウトします。
Unix / Linuxの世界にいる場合は、を使用してアラートを送信しsyslog
、その側で電子メールの生成を処理する代わりの方法を検討してください。たとえば、nsyslogdには、電子メールをネイティブに生成するためのommailというモジュールがあります。
IIRCには、最小限の(ゼロ?)コーディングでJavaとsyslogの世界を橋渡しできるlog4jなどのアダプターがあります。
Apache James - http://james.apache.org/を使用すると、独自のメールサーバーをプロキシとして実行できます。それだけでなく、100% Java で記述されているため、その機能を理解できます。おまけとして Jamesはデータベースを使用してメールをキューに入れるため、メールをデータベースに挿入することで直接キューに挿入することもできます。その後、メールの送信はすべて James に任せます。
Jamesを使用するという提案は良いものですが、過去にJamesが少し不安定で再起動する必要があるという問題がありました。
Quartz などを使用して、送信する必要があるメッセージをスケジューラーにチェックさせることができます。メッセージを送信できない場合 (smtp サーバーが利用できない場合など)、そのメッセージは後で送信されるように再スケジュールされます。メッセージごとにタスクを設定するか、メッセージと使用可能なメール サーバーをチェックしてからメッセージを送信する永続的なタスクを設定することができます。永続的なタスクにより、電子メールのバッチ処理が可能になります。