私はスケジューラ コンポーネントを作成しており、Quartz.net を使用する予定でした。私の要件は次のとおりです。
- スケジューラーを 24 時間 365 日実行します (停止/失敗は許容されます。もう一度開始する必要があります)。
- Web ページを介してスケジュールされているジョブ/トリガーを確認できる
- Web ページを介して新しいジョブ/トリガーを追加できる
常に実行しているスケジューラーが必要なので、Windows サービスを用意する予定でした。残念ながら、Web ページを Windows サービスで実行されているスケジューラと対話させる方法はないようです。Turan Aroraの例からまとめた次のコードを使用して、インスタンスを取得しようとしました。
NameValueCollection properties = new NameValueCollection();
properties["quartz.scheduler.instanceName"] = "ServerScheduler";
// set thread pool info
properties["quartz.threadPool.threadCount"] = "0";
// set remoting expoter
properties["quartz.scheduler.proxy"] = "true";
properties["quartz.scheduler.proxy.address"] = "tcp://localhost:555/QuartzScheduler";
// get a reference to the scheduler
ISchedulerFactory sf = new StdSchedulerFactory(properties);
IScheduler sched = sf.GetScheduler();
このルートに進むと、「'ServerScheduler' という名前のスケジューラは既に存在します」というエラーが表示されます。(ServerScheduler はデフォルトのスケジューラー名です。) いくつか読んだ後、解決策は、シングルトン パターンを実装して、スケジューラーのライフサイクル全体でこのインスタンスをインスタンス化して返すことであることがわかりました。
スケジューラー Windows サービスと Web サイトの 2 つの部分が必要だったので、これは理想的なソリューションとは思えません。明らかに、Web サイトはスケジューラーを所有すべきではありません。なぜなら、スケジューラーは 24 時間 365 日使用されている場合とされていない場合があり、スケジュールされたジョブを 24 時間 365 日実行できるようにする必要があるからです。第 2 に、この情報を取得するためにスケジューラへの参照を取得するために、自分の Web サイトが Windows サービスと通信することを望んでいないと思います。
この状況で Quartz.net を使用するアーキテクチャを誤解していると思います。しかし、私が正しければ、おそらく解決策は、Quartz.net がジョブを取得するために読み取ることができるリレーショナル データ ストアを維持することであり、Web サイトも何が実行されているかを確認するために読み取ることができます。とにかくリレーショナル データ ストアにジョブとトリガーを永続化させたいので、これが 2 つのアプリケーション間でデータを提供する最善の方法でしょうか?