1

ASP.NET MVC プロジェクトで、いくつかのタスクをスケジュールに従って実行するために Quartz lib を使用しています。Jobs を Global.asax ファイルの Application_Start メソッドに初期化します。しかし、Application_End メソッドが実行されたため、しばらくすると Quartz が停止しました。

変数は静的として宣言されました:

public static ISchedulerFactory scheduleFactory = new StdSchedulerFactory();

public static IScheduler scheduler = scheduleFactory.GetScheduler();

以下は、Quards のジョブが初期化された方法です。

IJobDetail jobSender = new JobDetailImpl("jobSender", "MailGroup", typeof(JobMailSender));

ITrigger triggerSender = new CronTriggerImpl("triggerSender", "SenderGroup", "jobSender", "MailGroup", "0 0/30 * * * ?");

scheduler.ScheduleJob(jobSender, triggerSender);

scheduler.Start();

私はそれが起こる理由を見つけました。すべてのユーザーのセッションが存在しなくなり、サーバーにアクティブなユーザーのセッションがない場合、メソッド Application_End が実行されます。

15 分ごとにサイトを開く新しい Quartz のジョブを作成しました。その結果、新しいユーザー セッションがサーバー上に作成されます。ただし、Application_End メソッドは時々呼び出されます。

誰かが同様の問題に直面していますか? サーバー上にアクティブなセッションがない場合でも、web.config に Application_End メソッドが実行されない設定が含まれている可能性があります。

4

2 に答える 2

2

IIS 内で Quartz を実行すると、これを含む問題が発生する可能性があることがわかりました。アプリケーション プールがリサイクルされているため、おそらく Application_End を取得しています。

Quartz をサービスとして同じマシンにインストールし、Quartz のリモート プロキシを介して Web サイトからそのサービスにアクセスすることで、この問題を回避しました。

次のリンクが役立つ場合があります: 1 つの Windows サービスを使用してジョブを実行し、2 つの Web アプリケーションを使用してジョブをスケジュールします。

于 2012-11-02T14:07:52.877 に答える
0

私たちのアプリケーションでも、しばらくしてから、または Web サーバーがアイドル状態のときに Application_End が呼び出され、その後、次のアクティビティで Application_Start が再度呼び出され、スケジュールが何度も実行されるという同じ問題に直面していました。

最終的に、データベースに cron_schedule という単純なテーブルを作成しました。これは、Quuratz の実行のログを維持するために使用されました。また、トリガー メソッドでは、データベースに存在する最後の実行時間が実行基準を満たしているかどうかを最初に確認し、トリガーを実行します。そうでない場合は、スケジュールが実行されたが何もしなかったことを知ることができるように、単にログを返すか、ログを作成します。 .

于 2013-05-03T05:17:44.003 に答える