Quartzフレームワークは、フル機能のオープンソースタスクスケジューリングサービスであり、小さなシングルチップシステムから大規模なeコマースシステムまで、ほぼすべてのJavaアプリケーションを統合できます。Quartzは、何千ものタスクスケジューリングを実行できます。Quartzスケジューラには、JTAトランザクションやクラスタのサポートなど、多くのエンタープライズレベルの機能が含まれています。(最も単純なスケジューラーは単純なタイマーであり、実行頻度です) Quatrzは通常のタイミングタスクと見なすことができます。Quartzのカプセル化後にのみ、より複雑なタスクのスケジューリングを完了することができます。アプリケーションに特定の時間に実行する必要のあるタスクがある場合、またはシステムに頻繁に保守する必要のあるタスクがある場合は、Quartzが理想的なソリューションになる可能性があります。Quartzは、次のアプリケーションを実行できます。
- アプリケーションで通知サービスを提供します。
- システムメンテナンス:毎日11:30(休日を除くすべての営業日)にデータベースの内容をXMLファイルにダンプするスケジューラーを提供します。
- ドライブプロセスワークフロー:新しい注文が最初に行われると、プログラムが2時間以内にアクティブ化され、注文のステータスを確認し、注文確認メッセージが受信されなかったときに警告通知をトリガーし、注文ステータスを「介入待ち」に変更します。
Quartzは、アプリケーションで使用されるほとんどすべてのタイミングタスクまたはスケジューリングタスクを満たすことができる強力な操作環境と機能を提供します。Quartzの公式機能は次のとおりです。
動作環境:
- Quartzは、別の独立したアプリケーションに組み込んで実行できます。
- Quartzは、アプリケーションサーバー(またはサーブレットコンテナ)でインスタンス化して、XAトランザクションに参加できます。
- Quartzは、スタンドアロンプログラムとして(独自のJava仮想マシンで)実行でき、RMIを介して使用できます。
- Quartzは、ジョブを実行するための独立したプログラムのセット(ロードバランシングおよびフェイルオーバー機能を備えた)としてインスタンス化できます。
ジョブスケジューリング:
ジョブは、特定のトリガーが発生したときに実行されるようにスケジュールされています。次のコマンドのほぼすべての組み合わせを使用して、トリガーを作成できます。
- 1日の特定の時間(ミリ秒まで正確)
- 特定の曜日
- 月の特定の日に
- 一年の特定の日に
- 特定の回数繰り返す
- 特定の日付まで繰り返します
- 繰り返し続ける
- たまに実行する
- カレンダーに記録されていない特定の日付(営業日など)
割り当ては作成者によって名前が付けられ、名前付きグループに配置できます。トリガーには名前を付けてグループ化することもできるため、スケジューラーで簡単に使用できます。ジョブはスケジューラーに一度追加できますが、複数のトリガーで登録できます。エンタープライズJava環境では、ジョブは分散(XA)トランザクションの一部として作業を実行できます。
ジョブの実行:
- ジョブは、ジョブインターフェイスを実装する任意のJavaクラスにすることができ、ジョブが実行できる作業に無制限の可能性を残します。
- ジョブクラスインスタンスは、QuartzまたはSpringなどのアプリケーションフレームワークによってインスタンス化できます。
- トリガーがトリガーされると、スケジューラーはJooListListorおよびTriggerListenerインターフェースを実装する既存のJavaオブジェクトに通知します(リスナーは単純なJavaオブジェクト、EJB、JMSパブリッシャーなどです)。これらのリスナーは、ジョブの実行後にも通知されます。
- ジョブが完了すると、ジョブ完了コード(JobCompletionCode)を返し、スケジューラーに成功または失敗を通知します。ジョブ完了コードは、ジョブをすぐに再実行するなど、成功/失敗コードに基づいてアクションを実行するようにスケジューラーに指示することもできます。
仕事の永続性:
- Quartzの設計には、ジョブストレージのさまざまなメカニズムを提供するために実装できるジョブストアインターフェイスが含まれています。
- JDBCJobstoreを使用すると、「非揮発性」(「非揮発性」)として構成されたすべてのジョブとトリガーが、JDBCを介してリレーショナルデータベースに格納されます。
- RAMJobStoreを使用すると、すべてのジョブとトリガーがRAMに保存されるため、プログラムの実行間で保持されませんが、これは外部データベースを必要としないという利点です。
事務:
- Quartzは、JobstoreCmt(JDBCJobstoreのサブクラス)を介してJTAトランザクションに参加できます。
- Quartzは、ジョブの実行(開始および送信)に関するJTAトランザクションを管理できるため、ジョブによって実行される作業はJTAトランザクションで自動的に発生します。
集まる:
- フェイルオーバー
- 負荷分散
- Quartzの組み込みクラスター機能は、JDBCJobstoreを介したデータベースの永続性に依存しています(上記のとおり)。
- Terracottaは、Quartzをサポートするデータベースを必要とせずに、Quartzのクラスタリング機能を拡張します。
リスナーとプラグイン:
- アプリケーションは、ジョブ/トリガーの動作を監視または制御する1つ以上のリスナーインターフェイスを実装することにより、スケジューリングイベントをキャプチャできます。
- Quartzには、多くの「ファクトリーモード」プラグインとリスナーが付属しています。
- プラグインメカニズムを使用して、ジョブ実行の履歴を保持したり、ファイルからジョブとトリガーの定義をロードしたりするなど、Quartzに機能を追加できます。
Quartzの使用は比較的簡単です。Mavenプロジェクトの場合、対応するjarファイルをpom.xmlに直接インポートできます。この例では、Mavenを使用して依存ファイルをインポートしています。アプリケーションを実行するとき、またはWarパッケージをパッケージ化するときに、依存関係を次の場所に直接パッケージ化できます。
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.3</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.3</version>
</dependency>
Quartzに必要なjarパッケージをインポートした後、簡単なQuartzプログラムを作成して実行できます。次のコードは、スケジューラのインスタンスを取得し、起動してから閉じます。このプロセスでは、構成ファイルは必要ありません。コードは次のとおりです。
public class QuzrtzTest {
public static void main(String[] args) {
try {
// 从工厂中获取一个调度器
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
// 定义一个作业类,并且绑定到HelloJob类上
JobDetail job = newJob(HelloJob.class).withIdentity("job1", "group1").build();
// 定义一个触发器,每隔10秒重复一次
Trigger trigger = newTrigger().withIdentity("trigger1", "group1").startNow() .withSchedule(simpleSchedule().withIntervalInSeconds(10).repeatForever()).build();
// 告诉Quartz调度器启动我们使用我们定义的作业和触发器
scheduler.scheduleJob(job, trigger);
// 启动调度器
scheduler.start();
// 关闭调度器
scheduler.shutdown();
} catch (SchedulerException se) {
se.printStackTrace();
}
}
}
public class HelloJob implements Job {
private static final Logger logger = LoggerFactory.getLogger(HelloJob.class);
public void execute(JobExecutionContext context) throws JobExecutionException {
logger.info("正在执行调度任务");
}
}
shutdown()を呼び出す前に、ジョブをトリガーして実行するための時間を確保する必要もあります。このような単純な例では、thread.sleep(60000)呼び出しを追加するだけで済みます。
Quartzは、quartz.propertiesという名前のプロパティファイルを使用できます。最初にこれを行う必要はありませんが、最も基本的な(デフォルトの)構成以外の構成を使用するには、構成ファイルをクラスパスに配置する必要があります。繰り返しますが、私の個人的な状況に基づいた例を挙げてください。私のアプリケーションは、WebLogicWorkshopを使用して開発されています。アプリケーションのルートディレクトリの下にあるプロジェクトのすべての構成ファイル(quartz.propertiesを含む)を保存します。すべてを.earファイルにパッケージ化すると、構成プロジェクトは.jarにパッケージ化され、最終的な.earに含まれていました。これにより、quartz.propertiesがクラスパスに自動的に配置されます。
Quartzを含む(つまり、.warファイルの形式の)Webアプリケーションを構築している場合は、Quartz.propertiesファイルをWEB-INF / classesフォルダーに配置して、クラスパスで取得できるようにする必要がある場合があります。これが一番大事なポイントです!Quartzは、高度に構成可能なアプリケーションです。クォーツを構成する最良の方法は、quartz.propertiesファイルを編集して、アプリケーションのクラスパスに配置することです。
Quartzディストリビューションには、特にexamples / directoryの下にいくつかのサンプルプロパティファイルがあります。例の1つをコピーして不要な部分を削除するのではなく、独自のquartz.propertiesファイルを作成することをお勧めします。この方法により、クォーツファイルとプロパティファイルがよりきれいに見えるようになり、クォーツがより多くの機能を提供することがわかります。すばやく起動して実行するために、基本的なquartz.propertiesは次のようになります。
org.quartz.scheduler.instanceName = MyScheduler
org.quartz.threadPool.threadCount = 3
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
- org.quartz.scheduler.instanceName - このスケジューラの名前は「MyScheduler」であります
- org.quartz.threadPool.threadCount - 3つのジョブまでを同時に実行できることを意味し、スレッドプール内の3件のスレッドがあります。
- org.quartz.jobStore.class - 、ジョブトリガ詳細などすべて石英データは、(いないデータベース内の)メモリに格納されます。データベースがあり、Quartzで使用したい場合でも、データベースを使用してQuartzプログラムを作成する方法を学ぶ前に、まずRamJobStoreを使用してQuartzアプリケーションを作成することをお勧めします。