3

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アプリのメソッドを直接実行する別のスケジューラーを用意するというアイデアもありましたが、それだけです。私のウェブアプリでは、そのようなリクエストを実行する権限が必要です。また、解決する必要のある問題があります。何千ものスケジュールされたタスクの場合、そのようなリクエストでウェブサーバーに追加の負荷がかかります。

4

5 に答える 5

2

あなたは正しい方向に進んでいると思います。アプリプールのリサイクルの問題があるため、Quartz.NETを使用してスケジューラを作成し、Windowsサービスでホストします。

Webアプリまたは個別のWebサービスインスタンスのいずれかのタスク/サービスごとに特定のURLを使用して、Webアプリのタスク/サービスをトリガーします。

この分離を使用すると、スケジューラーはURLとスケジュールについて知るだけでよく、アプリを直接参照する必要はありません。これは、将来のプロジェクトでも再利用できます。

于 2012-07-08T15:23:15.013 に答える
1

Webサーバーがアプリケーションプールなどをリサイクルできるため、Webアプリケーション内でスケジューリングをホストすることはお勧めできません。そのため、Windowsサービス内で使用することにしました...

なぜ複雑なのですか?シンプルにして、外部サービスを使用して一定期間Webhookを実行してみませんか?

私はこのサービスを使用していて満足していますが、この簡単な手順に基づいて独自のサービスを作成するのはとても簡単です。

http://momentapp.com/

呼び出しを簡素化するには:

private void Run() {
     try {
        var work = RequestNewMessage();  // get work
        ProcessWork(work);  // process work
        // Log work 
     }
     catch(Exception ex) {
        // Log Error
     }
     finally {
        // set job for now plus1 minute
        SetRecuringJob(DateTime.UtcNow.AddMinute(1)); 
     }
}

private void SetRecuringJob(DateTime dt) {
    PostJob("https://momentapp.com/jobs/new?job[at]={0:s}&job[method]=POST&job[uri]=http://yourapp.com/", dt);
}
于 2012-07-03T07:39:10.353 に答える
1

少し遅れると思いますが、それでも他の人には役立つかもしれません。

これは私がかなりの時間を費やしたプロジェクトであり、記載されているほとんどの要件を満たしているようです。実際、質問で説明されているように、コールバックジョブにほぼ排他的に使用しています。それは私たちが内部で使用しているものでもあるので、私はそれを最新の状態に保つようにしています。

http://backgroundworker.codeplex.com/

Quartzとよく似ていますが、ジョブとそのデータの管理に重点を置いています。

于 2012-10-28T07:16:38.743 に答える
0

問題がWindowServiceからWebアプリ全体を参照したくない場合で、それに同意します。プレーンなhttpurlを介してWebアプリを呼び出すことができる汎用ジョブを実装するユーティリティdllを作成してみませんか。 「アクション」をWCFRESTサービスとして実装しますか?これにより、アーキテクチャが少しクリーンアップされ、組織内のスケジューラサービスが分離(および再利用可能)に保たれると思います。

于 2012-07-09T07:51:59.817 に答える
0

要件が不足している可能性がありますが、カスタムサービスをインストールできるように見えるため、そのマシンを完全に制御できるようです。したがって、定期的なジョブに対してWindowsタスクをスケジュールすることもできます。これにより、定期的なタスクのかなり確実な基盤が得られます。

次に、VBスクリプトをスケジュールして、次のようにタイムリーにURLをロードできます。http://4rapiddev.com/internet/call-or-open-a-web-page-url-by-using-windows-task -scheduler-or-cronjob /

もちろん、バッチファイルから、PowerShellからカスタム実行可能ファイルまで、何でもかまいません。

このアプローチの利点:

  • OSの長所については、デフォルトのOSの動作に依存できます。スケジューリング:)
  • 管理者用のUIはすでにあります(Web UIではありませんが)
  • 依存関係はありませんが、OS

考えられる欠点:

  • ユーザーに公開する場合は、独自のWeb管理を構築する必要があります(たとえば、これらのいずれかをベースとして使用します:http: //www.codeproject.com/Articles/2407/A-New-Task-Scheduler -Class-Library-for-NETまたはhttp://taskscheduler.codeplex.com/)。
  • エンドユーザーがタスクを操作できる場合、セキュリティが問題になる可能性があります
  • 障害またはタイムアウトで何が発生するかについてのよりきめ細かい制御(スケジューラーがそれらを処理する方法を操作することもできるため、問題の大きさはわかりません)

編集:認証の要件を満たしていないようですが、Windowsを使用している場合は、アプリの特定の領域内でWindows認証を許可できます。また、Windowsで認証されたスケジュールされたタスクを使用しているためこれをカバーできます。ASP.NETアプリ内でWindows認証を頻繁に使用したことはありませんが、カスタム構成のみで追加のプログラミングを行わなくても済む場合があります。

于 2012-07-09T22:37:48.910 に答える