2016-05-28 8 views
1

私は以下の問題の解決策を探しています。私はウェブサイトを持っており、約1時間ごとに(約)いくつかのアドレスにメールを送ります。 私はC#用のQuartzライブラリを使用することに決めました。私は、[スタート]()関数を仕事を書き、実行します。ASP.NET Webサイト数分ごとにプロセスを実行します

public static void Start() 
{ 
    IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler(); 
    scheduler.Start(); 

    IJobDetail job = JobBuilder.Create<EmailJob>().Build(); 

    ITrigger trigger = TriggerBuilder.Create() 
    .WithIdentity("trigger1", "group1") 
    .StartNow() 
    .WithSimpleSchedule(x => x 
     .WithIntervalInMinutes(50) 
     .RepeatForever()) 
    .Build(); 

    scheduler.ScheduleJob(job, trigger); 
} 

のApplication_Startで():

JobScheduler.Start(); 

私はローカルのウェブサイトを実行すると、アプリケーションがでているので、それは、完璧な作品」常に "再生"モードになります。期待どおり50分ごとにメールを送信します。

問題が発生しました:Webサイトをサーバーにアップロードすると、Jobは初めて1回のみ動作しました。私はそれについて読んだ後、この問題の私の結論は、Webアプリケーションには "スリープ"モードがあるので、誰かがウェブサイトに入らないと、アプリケーションがスリープしてジョブが機能しなくなり、電子メールが送信されないということです。

私の質問は - 私は50分ごとに機能を実行し、誰かがウェブサイトに入ったかどうかに依存しないスケジューラが必要な場合はどうすればよいですか?

+0

あなたのサイトを常に稼働させるために何らかの種類のサイトモニタを使用してください – Aristos

+0

[あなたのASP.NETアプリケーションがシャットダウンしないようにすることはできますか?](http://stackoverflow.com/questions/1306380/can-あなたはあなたのasp-net-application-shut-downから) –

+0

それ以外に、アプリケーション初期化モジュールhttp://www.iis.net/downloads/microsoft/application-initializationがあります。しかし、それはIIS 7.5以上、およびフレームワーク4.0以上でのみ機能します。 –

答えて

0

デザインを確認してください。コンソールアプリケーションを作成し、を使用すると便利です。Windows Service Application

0

使用するIISのバージョンによって若干異なります。

<applicationPools> 
    <add name="appName" managedRuntimeVersion="v4.0" startMode="AlwaysRunning" /> 
</applicationPools> 

それとも、アプリケーションプールの高度な設定をクリックして、IIS管理でこれを変更することができます。あなたのweb.configこのようなapplicationsPoolsセクションを追加で
:しかし、あなたはalwaysrunningモードであなたのアプリケーションを設定する必要があります。

編集(アプリケーションのコースのバージョンにmanagedRuntimeVersionを設定):ラヴィが言ったように、これは、スタートアップモジュールまたはサイトの稼働を維持するいくつかの外部サービスと組み合わせることがあります。

もう1つの解決策は、Hangfireに移行して、IProcessHostPreloadClientを私のalwaysrunningアプローチとともに使用することです。

+0

実際にこの設定は、IISがリサイクルまたはクラッシュ中に新しいw3wpをスピンすることを確認するだけですが、アプリケーションドメインを起動して必要なアセンブリをロードしないため、アプリケーション初期化モジュールやpingdomのような外部サービスが必要ですappdomainを起動し、必要なアセンブリをロードするダミー要求。 –

+0

うん、それはちゃんと聞こえる。サイトが再起動したときにQuartzジョブが再スケジュールされ、ジョブが実行されなくなる可能性があります。私は、Quartzがこれを処理するための何らかの機能を持っているのかどうかはわかりませんが、 'IProcessHostPreloadClient'を使って' Hangfire'は行います。 – Hypnobrew

+0

申し訳ありません、ここで編集したいと思っています - 「実際にこの設定では、リサイクル/クラッシュ/アイドルタイムアウト中にIISが新しいw3wpをスピンすることが確認されますが、アプリケーションドメインを起動して必要なアセンブリをロードしないため、 pingdomのような外部サービスは、appdomainを起動して必要なアセンブリをロードするダミー要求を生成します。 " –

関連する問題