2

他の人がどのようにメーリングを行っているのか、ベスト プラクティスについてどのように考えているのか疑問に思っていました。メーリングをどのように行うことができるかを考えるとき、さまざまなテクノロジでさまざまな方法で実現できるソリューションは 1 つしか思い浮かびません。

  1. メールを何らかの方法で永続化する (DB に保存し、JMS 経由で送信する)
  2. まだ正常に送信されていない新しいメールがないか (スケジューラーを使用して DB または JMS 経由で取得) を継続的にチェックし、エラーが発生した場合は後で再試行します。

本当に正当な理由なしに誰も使用しないことを願っているもう 1 つのオプションは、ビジネス ロジック内でメールを送信することであり、トランザクションが失敗する可能性があります (または、特定の時間セットでメールの送信を再試行すると非常に時間がかかります)。メールを送信できませんでした。

別のプロジェクトで、DB に継続的にクエリを実行し、現在の時刻などの基準に基づいてメールを送信するスタンドアロンのメール送信アプリを見てきました。

では、何が良い解決策だと思いますか、それともプロジェクトで実際に何を使用していますか? グーグルでその実例を見つけることができませんでした。おそらく十分に検索していませんでしたが、もしそうなら、あなたのリソースを私と共有してください!

編集 「正しい方法」を定義するために、いくつかの要件を追加したいと思います。

  • メールは永続的で、編集可能で、再送信可能である必要があります
  • いくつかの基準に基づいて、特定の時間にメールを送信できます
  • ソリューションは水平方向にスケーリングする必要があります

EE6 は、TimerService と Async オペレーションを備えた EJB を提供します。EE6環境の「正しい方法」を尋ねることで、そのような標準要件に対してメーリングがどのように使用/実装されることになっているのかを知りたい.

オラクルのサイトには、@Async EJB メソッドでのメール セッションの使用法を示す記事がいくつかありますが、その使用法はどこか間違っているように思えます。タイマーサービスを利用してメールの再送信を行うべきですか? メールを DB に保持し、インターバル タイマーを使用してフェッチして送信する必要がありますか? メールの送信をアプリの外に移動する必要がありますか?

他の人がどのソリューションを使用しているかを知り、そのような(できれば私だけではない)一般的な要件に対するより良いまたは悪いソリューションについての意見を聞きたいです。

4

2 に答える 2

2

私たちのプロジェクトでは、Quartz スケジューラを使用してジョブを実行します。ジョブが電子メールを送信するようにスケジュールされる前に、メッセージが作成され、件名、本文、受信者などの電子メールのさまざまな部分がデータベースに保存されます。Quartz ジョブが実行され、電子メールを正常に送信できる場合、メッセージのsent_flg が SENT に設定されます。失敗した場合、quartz ジョブはしばらくしてから同じパラメーターで再度実行されるようにスケジュールされています。あきらめる前に、一定の回数試行します。管理者が送信したい場合に失敗したメッセージを再送信できる画面もあります。

于 2012-09-15T10:25:17.630 に答える
1

1 つのオプションは、おそらくこの目的専用のMTAをインストールすることです (Linux の sendmail など)。(Java)アプリケーションと同じノードで実行します。特にローカルで実行している場合、このサーバーは利用可能であることが「保証」されている必要があります。これをSMTPサーバーとして使用して、アプリケーションサーバーにメールを送信させるだけです。その時点で、それは事実上「ファイア アンド フォーゲット」であり、JMS のようなものと同じくらい優れています。適切に構成された MTA は、すぐにメッセージを受け入れ (JVM が途中で続行できるようにします)、メッセージの再送信などを試みる独自のスレッドに時間を費やします。

このアプローチの唯一の実際の欠点は、特定の電子メールの実際の進行状況について Java から (ログ ファイルの解析などを行わずに) 簡単に調べることができないことですが、それでも電子メールは保証されません。上流のメールサーバーまたは受信クライアントによって拒否/ドロップされる可能性があります。

于 2012-09-13T13:07:10.327 に答える