2

私はスケジューラ コンポーネントを作成しており、Quartz.net を使用する予定でした。私の要件は次のとおりです。

  1. スケジューラーを 24 時間 365 日実行します (停止/失敗は許容されます。もう一度開始する必要があります)。
  2. Web ページを介してスケジュールされているジョブ/トリガーを確認できる
  3. 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 つのアプリケーション間でデータを提供する最善の方法でしょうか?

4

1 に答える 1

2

この場合にやりたいことは、試したようにリモーティングを介して接続することです。異なるインスタンス名を持つ同じマシンで Quartz.NET プロセスを実行しているかどうかを確認してください。

AdoJobStore を使用して実行することが既に決定されている場合、簡単なオプションの 1 つは、実際にスケジューラーを開始せずに Web アプリから同じジョブ ストアに接続することです。ジョブ ストアのジョブとトリガーを Web アプリからクエリおよび変更し、サービスにジョブの実際のトリガーを実行させることができます。説明されたシナリオに関連する回答は次のとおりです。

于 2013-09-24T04:02:43.903 に答える