2

メール送信の調整に使用するがありjava.util.Timerます (ステータス メールが最近送信された場合は、今は送信せずにタイマー タスクを作成して、後で新しいステータスと共に送信します)。

私が望むのは、キューに入れられた電子メールが最終的に送信されるようにすることですが、キューに入れられていない場合はプログラムを正常にシャットダウンできるようにすることです。残念ながら、私はそれをどのように行うかを決めることができません:

  • タイマーをデフォルト (非デーモン) モードのままにしておくと、明示的にキャンセルされるまでプロセスが終了しなくなります。

  • タイマーをデーモン モードに設定すると、シャットダウンは許可されますが、キューに入れられたタスク (つまり、未送信の電子メール) は破棄されます。

私がこれまで行ってきたことは、電子メールが送信された後に明示的にタイマーをキャンセルし (そしてガベージ コレクションを行う)、将来の遅延電子メールのために必要になったときに新しいタイマーを再作成することです。これは不必要な解約のようです。

タイマーのデーモン状態を制御する方法はありますか? または、この遅延メール スキームを実現するタイマーの代替手段はありますか?

編集私の現在のソリューションは、厄介ですが、電子メール送信は「発射して忘れる」という利点があることに注意してください。電子メール送信者への呼び出しが行われると、Timer の非デーモン状態により、アプリケーションの他の部分がその間にシャットダウンを引き起こしたとしても、電子メールが送信されることが保証されます。これにより、タイマーを制御するための特別なアプリケーション シャットダウン コードが不要になります。

4

4 に答える 4

1

@tieTYT によって提案されたスレッド プール エグゼキューターがニーズに合わない場合は、アプリケーションの終了時にタイマーでシャットダウンされた非デーモン タイマーを使用してみませんか? 正常にシャットダウンしていると仮定すると、コードはクリーンアップに関するいくつかの手順を実行する方法を提供する必要があります。あるいは、最後の努力として、シャットダウン フックを追加してタイマーをキャンセルすることもできます。

于 2013-09-10T00:48:18.940 に答える
0

Timerのjavadoc は次のように述べています。

Java 5.0 は java.util.concurrent パッケージを導入しました。その中の同時実行ユーティリティの 1 つは ScheduledThreadPoolExecutor です。これは、特定の速度または遅延でタスクを繰り返し実行するためのスレッド プールです。これは、複数のサービス スレッドを許可し、さまざまな時間単位を受け入れ、TimerTask のサブクラス化を必要としない (Runnable を実装するだけである) ため、実質的に Timer/TimerTask の組み合わせのより汎用性の高い代替品です。1 つのスレッドで ScheduledThreadPoolExecutor を構成すると、Timer と同等になります。

そのため、代わりに ScheduledThreadPoolExecutor を使用する必要があり、Thread.join()を使用してシャットダウンを防ぐことができます

于 2013-09-09T23:57:40.330 に答える
0

それを処理する3つの方法が考えられます。それらのどれもあなたの状況からは些細なことに見えます。

  1. アプリケーションの最後にシャットダウン コードを追加して、電子メールが送信されるまで待ちます。これはプレーン スレッドで行うことも、よりエレガントに Threadpool を使用して行うこともできます。
  2. 電子メールが送信されるまでJVMを効果的に実行し続けるスレッドをデーモンとして構成します。
  3. ApplicationServer などの別のプロセスに作業を委任します。これは、確実に実行されている管理対象インスタンスである必要があります。次に、Bean をそれに送信して、待機して電子メールを送信できます。

あなたの好みの方法はどれですか?

于 2013-09-11T05:31:52.233 に答える
0

私はこれを試していないので少しばかげているかもしれませんが、タイマーを非デーモンに設定し、タイマーをキャンセルする前にメールキューが空になるのを待つシャットダウンフックを登録できませんか?

于 2013-09-10T07:39:17.533 に答える