1

実装に焦点を当てたものではなく、コード固有のように見えるすべてのチュートリアルを読んだ後も、Quartz.NETに頭を悩ませようとしています。これが私がやろうとしていることです。ログテーブルのクエリ、他のプロセスへのデータの再送信など、さまざまなことを実行する20個のSQLストアドプロシージャがあります。これらのSPを1日中定期的に実行したいと考えています。したがって、Quartz.NETにとっては当然のように思えます。Quartz.NETを実装し、Quartzアセンブリと同じフォルダー内のアセンブリにジョブを含むWindowsSvcを作成する予定です。

これを実装するための悪い方法の1つは、SPごとに1つのジョブクラスを作成し、それぞれに個別のトリガーを関連付けることだと思います。ジョブクラスは、名前がクラスにハードコーディングされている特定のSPを実行するだけです。それは悪い方法です。

しかし、私の一生の間、私は良い方法が何であるかを理解することができません。明らかに、名前が単純なSQLテーブルから取得される一般的な「名前でSPを実行する」だけを実行する単一のジョブクラスを持つことは道のりのようですが、異なるSPに関連付けられた異なるトリガーを取得するにはどうすればよいですか? Quartzは、20個すべてのSPを別々のスレッドにロードすることを知っていますか?

そして、Quartzは、たとえばSPの1つに対して、変更されたトリガーをピックアップすることをどのように知るのでしょうか。それは、ジョブとトリガーをリロードするためのWin Svcの開始/停止サイクルである必要がありますか、それともある種の「リロード」を手動でコーディングする必要がありますか?

何かご意見は?クォーツとは何か誤解していますか?言い回しは、エンタープライズスケジューラ、システム、インストールするもののように聞こえます。OTOHのすべてのドキュメントでは、独自のスケジューラまたはスケジューリングシステムを作成するためにつなぎ合わせた一連のクラスのように見えます。たとえば、FTPを実行するアプリを作成するためにMSが.NETで提供するクラスと同じです。多分私はあまりにも多くを期待していますか?

4

1 に答える 1

3

要件を満たす非常に簡単な方法は次のとおりです。

サンプルサーバーから始める

Quartz.NETディストリビューションのサーバーを出発点として、TopShelfを利用して簡単にインストールできるWindowsサービス用の既製のテンプレートがあります。

変更検出でXML構成を使用する

quartz.configファイルには実際の構成が含まれており、XMLファイルquartz_jobs.xmlからジョブとトリガーが読み取られていることがわかります。

変更を監視するには、 quartz.plugin.xml.scanInterval = 10を追加する必要があります(10秒ごと)

トリガージョブデータマップを使用して、ジョブをパラメーター化します

SQLの実行が提案どおりに簡単な場合は、すべてのトリガーに同じジョブクラスを使用できます。XMLでトリガーの定義に必要な構成を追加するだけです(ここでは、10秒ごとに実行されるサンプル、必要な数のトリガーを追加します)。

<trigger>
  <simple>
    <name>sqlTrigger1</name>
    <job-name>genericSqlJob</job-name>
    <job-group>sqlJobs</job-group>
    <job-data-map>
      <entry>
        <key>sql_to_run</key>
        <value>select 1</value>
      </entry>
    </job-data-map>
    <misfire-instruction>SmartPolicy</misfire-instruction>
    <repeat-count>-1</repeat-count>
    <repeat-interval>10000</repeat-interval>
  </simple>
</trigger>

クォーツ_jobs.xmlをベースとして使用し、必要な変更を加えるだけです。

仕事で構成を使用する

ジョブの構成には、ジョブとトリガーの両方のパラメーターを含むコンテキストのMergedJobDataMapからアクセスできます。後者は、前者をオーバーライドします。

public void Execute(IJobExecutionContext context)
{
    string sqlToRun = context.MergedJobDataMap.GetString("sql_to_run");
    SqlTemplate.ExecuteSql(sqlToRun);
}
于 2013-03-12T11:47:28.810 に答える