MVC3Webappでタスクをスケジュールするためのアドバイスが必要です。
私の仕事は、開発の後半で使用できるWebアプリ内のさまざまなサービス用の汎用スケジューラーを作成することです。たとえば、ユーザーがいつでもスケジュールできる利用可能なタスクがいくつかあります。
車輪の再発明をしたくなかったので、スケジューラーの作成に使用できるQuartz.Netライブラリーを見つけました。
Webサーバー内でスケジューリングをホストするのは良い考えではないことを知っています。Webサーバーはアプリケーションプールなどをリサイクルできるため、Windowsサービス内で使用し、Quartz.NETリモーティング機能を使用してWebアプリケーション内でタスクをトリガーすることにしました。
しかし、私はそれにいくつかの問題を見つけました。間違っている場合は訂正してください。ただし、Quartz.NET Remotingを使用しようとすると、Windowsサービスプロセス内でジョブが実行されます。つまり、Webアプリケーション内のすべてのタイプ、つまりWebアプリケーションのすべてのアセンブリについて知る必要があります。参照する必要があり、データベースなどの別の構成ファイルが必要です。したがって、新しいジョブクラスを作成する場合、簡単にスケジュールできず、サービスを停止してライブラリを更新する必要があります。それはあまり一般的なアプローチではありません。
Quartz.NETがそのインターフェースのみに基づいてジョブを実行できるという情報が見つかりません。
そこで、Windowsサービスでホストされ、Webアプリに実装されるIJobインターフェイスを備えた独自のスケジューラーを作成するというアイデアを思いつきました。また、IPCチャネルを使用した.Netリモーティングも使用します。したがって、Webアプリは.Net Remoting Serverのようになり、新しいジョブを追加してスケジュールする場合は、IJobインターフェイスを実装する新しいジョブを作成するだけで済みます。として登録します
IpcChannel channel = new IpcChannel("CurrentIPC");
ChannelServices.RegisterChannel(channel);
RemotingConfiguration.RegisterWellKnownServiceType(
typeof(SimpleJob), "SimpleJob", WellKnownObjectMode.SingleCall);
RemotingConfiguration.RegisterWellKnownServiceType(
typeof(ComplexObject), "ComplexObject", WellKnownObjectMode.SingleCall);
この場合、2つのジョブタイプが登録されます。次に、ジョブをスケジュールするときに、クラスの名前を渡し、クライアントを表すWindowsサービス側(Webアプリケーション側でオブジェクトを実行する)で、渡されたクラスの名前を次のようにIJobにバインドします。
Dictionary<string, IJob> jobs = new Dictionary<string, IJob>();
void AddJob(string name)
{
IJob obj = (IJob)Activator.GetObject(typeof(IJob), string.Format("ipc://CurrentIPC/{0}", name));
jobs.Add(name, obj);
}
だから今、私は自分のアプリや他のものへの参照について気にする必要はありません、スケジューラーは何も知らなくてもその仕事をします、ただIJobインターフェースとウェブアプリ側でタスクを実行します。
私が間違っているか、複雑すぎて、これを行うための他の簡単な方法がある場合、または私が気付いていないいくつかの落とし穴がある場合、あなたはそれを手伝ってくれますか?ありがとうございました。
PSまた、「http:// localhost:3030 / Request / 12」など、Webアプリで指定されたサービスへのリンクを実行することにより、Webアプリのメソッドを直接実行する別のスケジューラーを用意するというアイデアもありましたが、それだけです。私のウェブアプリでは、そのようなリクエストを実行する権限が必要です。また、解決する必要のある問題があります。何千ものスケジュールされたタスクの場合、そのようなリクエストでウェブサーバーに追加の負荷がかかります。