1.リソースSchedulerFactory
1.1はじめに
方法でブロックを構築するクォーツは、したがって、それを実行するために、いくつかのコンポーネントは、幸いなことに、よく一緒にスナップこと、既存のアシスタントのいくつかは、これらのタスク、SchedulerFactoryによって作成されたすべてのスケジューラインスタンスを完了することができている必要があります。
クォーツ3つのコアコンセプト:スケジューラ、タスク、トリガーの間の関係、3
SchedulerFactory - >スケジューラ - >トリガ/仕事
我々が使用する前に、SchedulerFactoryインタフェースは2つのサブクラス、1 StdSchedulerFactoryを持ち、もう一方はDirectSchedulerFactoryあるStdSchedulerFactoryです。
ジョブは、より重要である三つの要素スケジューラ、JobDetail、トリガ、およびジョブトリガドライブのではなく、トリガタイミングドライバジョブに、ジョブが実行されないように、仕事のために、それがジョブの複数に対応することができますトリガー、単一のトリガは、トリガは、トリガが唯一の私たちは、複雑な計画をトリガする必要がある場合に、複数のトリガーを作成してジョブに割り当てることができ、ジョブに割り当てることができるように、ジョブにのみ対応することができます。
1.2スケジューラが道を作成します
1.2.1 StdSchedulerFactory
クォーツデフォルトSchedulerFactory。
クォーツスケジューラを作成し、初期化するパラメータの1セット(java.util.Properties)。
設定パラメータ2.典型的quartz.propertiesファイルが格納されています。
3.コールgetSchedulerメソッドは、オブジェクト・ディスパッチャーを作成および初期化することができるようになります。例えば:
// Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
SchedulerFactory s = new StdSchedulerFactory();
Scheduler scheduler = s.getScheduler();
注:、知っているソースコードを参照StdSchedulerFactory.getDefaultScheduler();このメソッドの内部実装を使用することです。
1.2.2スケジューラ的API
開始時間スケジューラを取得します。1.
日付たstartDate = scheduler.scheduleJob(jobDetail、トリガー)。
2. [スタート]タスクのスケジューリング
scheduler.start();
中断3.タスクスケジューリングハング、
scheduler.standby();
4.閉じるタスクスケジューラ
scheduler.shutdown();
scheduler.shutdown(真):スケジューラ近い、その後終了し、実行中のすべてのジョブを表して待っている、とした後、
scheduler.shutdown(偽):直接閉じスケジューラを表し
1.3 DirectSchedulerFactory
DirectSchedulerFactoryはSchedulerFactoryの直接実装を直接介してスケジューラ、スレッドプールおよび他方を構成することが可能です。
DirectSchedulerFactory instance = DirectSchedulerFactory.getInstance();
Scheduler scheduler1 = instance.getScheduler();
2. Quartz.propertiesプロフィール
デフォルトのパス:石英-2.3.0 org.quartz.propertiesで
注:デフォルトの設定ファイルを使用しない場合、我々は、リソースディレクトリに新しいquartz.properties構成ファイルを作成することができ、このファイルに独自の構成情報を書き込みます
2.1詳細なプロフィール
# Default Properties file for use by StdSchedulerFactory
# to create a Quartz Scheduler Instance, if a different
# properties file is not explicitly specified.
#
org.quartz.scheduler.instanceName: DefaultQuartzScheduler
org.quartz.scheduler.rmi.export: false
org.quartz.scheduler.rmi.proxy: false
org.quartz.scheduler.wrapJobExecutionInUserTransaction: false
org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount: 10
org.quartz.threadPool.threadPriority: 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true
org.quartz.jobStore.misfireThreshold: 60000
org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore
2.1.1スケジューラのプロパティ
1. org.quartz.scheduler.instanceName:特定のスケジューリングインスタンスを区別するために使用される、スケジューラは、機能目的に応じて名前を付けることができます。
2. org.quartz.scheduler.instanceId:クラスタとして、スケジューラは、任意の文字列を許可する、インスタンスを区別するために使用されているが、この値は、特にクラスタ環境では、すべてのスケジューラ・インスタンス間で一意である必要があります唯一の鍵。
注:クォーツをしたい場合は、自動的にAUTOに設定できる値を生成します。
たとえば、次のようにorg.quartz.scheduler.instanceId:AUTO
2.1.2スレッドプールのプロパティ
1. THREADCOUNT:スレッドの数は、少なくとも1、仕事に対処するが、それのほとんどは、ほとんどのマシンで最高ではない以上100語以内、100以上が特にジョブの実行に長い時間の場合には、非常に非現実的になっています。
2. threadPriority:スレッドの優先順位は、スレッドの優先順位スレッドよりも高い優先度を実現することができます。ほとんどの10、デフォルトでは、少なくとも1、5
3. threadPool.class:実装インタフェース、石英自スレッドプールの実装クラスがorg.quartz.smpl.SimpleThreadPoolあることorg.quartz.ThreadPoolクラス
2.1.3ジョブのストレージ設定
これは、スケジューラ・インスタンスのライフサイクル、ジョブのトリガーを記述する情報が格納される方法
org.quartz.jobStore.class:org.quartz.simpl.RAMJobStore
2.1.4プラグイン構成
クォーツプラグイン構成の使用の特定のニーズを満たすために
2.リスナー
あなたが事件について懸念しているタスクのスケジューリングは、事件のタイムリーな通知を得ることができたときのためにクォーツリスナー。電子メールタスクの実行プロセス、およびSMSアラートに似ています。
クォーツリスナー主にJobListener、TriggerListenerは、SchedulerListener 3種類は3人のリスナーの使用に対応した同様のタスク、トリガー、スケジューラを表します。
2.1グローバル・リスナー
グローバル・リスナーは、すべてのイベント通知求人/トリガーのを受け取ることができます
// 创建一个全局的监听器
scheduler.getListenerManager().addJobListener(new MyJobListener(),EverythingMatcher.allJobs());
2.2ローカル・リスナー
非グローバル・リスナーは唯一のジョブが登録されていないか、トリガーが耳を傾けることはありません、仕事やトリガイベントでそのレジストリを受け取ることができます。
// 创建一个局部监听器
scheduler.getListenerManager().addJobListener(new MyJobListener(),KeyMatcher.keyEquals(JobKey.jobKey("job1", "group1")));
2.3 JobListener
タスクのスケジューリング、タスク関連の仕事のイベントが含まれます:プロンプトの開始は、ジョブを実行するには、ジョブの実行完了警告灯を
メソッドと関数のインタフェース2.3.1 JobListener
1.のgetName():JobListenerの名前を取得するために使用
2. jobToBeExecuted(JobExecutionContextコンテキストは):スケジューラはjobDetailときに実行されるように、このメソッドを呼び出し
3. jobExecutionVetoed(JobExecutionContextコンテキスト):スケジューラがjobDetailで実行されようとしているが、この方法はTriggerListener拒否された呼び出します。
4. jobWasExecuted():スケジューラは、方法はJobDetail後に行われる呼び出し。
仕事リスナー2.3.2カスタム
リスナクラスを作成します。1.
package cn.bjc.quartz.listener;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobListener;
public class MyJobListener implements JobListener{
@Override
public String getName() {
String name = this.getClass().getSimpleName();
System.out.println("name = " + name);
return name;
}
@Override
public void jobToBeExecuted(JobExecutionContext context) {
String name = context.getJobDetail().getKey().getName();
System.out.println("Job的名称是:" + name + " Scheduler在jobDetail将要被执行时调用的方法。");
}
@Override
public void jobExecutionVetoed(JobExecutionContext context) {
System.out.println("xxx");
}
@Override
public void jobWasExecuted(JobExecutionContext context, JobExecutionException jobException) {
System.out.println("yyy");
}
}
リスナーを追加します。2.
2.1グローバルリスナーを追加
scheduler.startに();次のコードを追加する前に、EverythingMatcher.allJobs()すべてのジョブを表します
scheduler.getListenerManager().addJobListener(new MyJobListener(),EverythingMatcher.allJobs());
2.2指定されたジョブを聞いて、ローカル・リスナーを追加します
scheduler.getListenerManager().addJobListener(new MyJobListener(),KeyMatcher.keyEquals(JobKey.jobKey("job1", "group1")));
完全な呼び出しコード:
package cn.bjc.quartz.main;
import java.util.Date;
import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.matchers.EverythingMatcher;
import org.quartz.impl.matchers.KeyMatcher;
import cn.bjc.quartz.job.HelloJobListener;
import cn.bjc.quartz.listener.MyJobListener;
public class JobListenerDemo {
public static void main(String[] args) throws Exception {
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
// 2. 任务实例(JobDetail),通过JobBuilder创建
JobDetail jobDetail = JobBuilder.newJob(HelloJobListener.class)
.withIdentity("job1", "group1")
.usingJobData("msg", "日志打印")
.usingJobData("count", 0)
.build();
// 3. 触发器(Trigger)
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger1", "group1")
.startNow()
.withSchedule(CronScheduleBuilder.cronSchedule("* * * * * ?")) // 日历每秒执行
.build();
Date startDate = scheduler.scheduleJob(jobDetail, trigger);
// 创建一个全局的监听器
// scheduler.getListenerManager().addJobListener(new MyJobListener(),EverythingMatcher.allJobs());
// 创建一个局部监听器
scheduler.getListenerManager().addJobListener(new MyJobListener(),KeyMatcher.keyEquals(JobKey.jobKey("job1", "group1")));
// 启动
scheduler.start();
}
}
2.4 TriggerListener
タスクのスケジューリング、イベント関連のトリガーがトリガー含める:トリガートリガーは、トリガーが正しく、トリガなど、完全な発射されていません。
2.4.1のTriggerListenerインタフェース定義方法
1.のgetName():フリップフロップの名前を取得するために使用
2. triggerField(トリガトリガー、JobExecutionContextコンテキスト):リスナーに関連付けられているトリガがトリガされ、ジョブのメソッドを実行し、メソッドを呼び出すために、スケジューラを実行します。
3. vetoJobExecution(トリガートリガー、JobExecutionContextコンテキスト):トリガのトリガ後、ジョブはスケジューラによって実行された場合、このメソッドを呼び出すために行く、TriggerListenerは、ジョブの実行の拒否権に選択肢を与えられました。このメソッドがtrueを返す場合、この仕事は、このトリガのないトリガーを実装されます。
4. triggerMisfired(トリガトリガ):スケジューラがトリガーミスは、あなたがロジックの長い期間、この方法を心配しなければならないときに、このメソッドがトリガーされた呼び出します。多くのトリガーは、トリガーをミスしたとき、長いロジックの出現は、ドミノ効果につながるので、あなたこの方法は、可能な限り小さく上で可能な限り維持されるべきです。
5. triggerComplete(トリガートリガー):トリガーがトリガーとジョブの実行が完了すると、スケジューラは、このメソッドを呼び出します。
2.4.2カスタマイズAリスナーTriggerListener
リスナーを作成します。1.
MyTriggerListener.java
package cn.bjc.quartz.listener;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobListener;
import org.quartz.Trigger;
import org.quartz.Trigger.CompletedExecutionInstruction;
import org.quartz.TriggerListener;
public class MyTriggerListener implements TriggerListener{
@Override
public String getName() {
String name = this.getClass().getSimpleName();
System.out.println("触发器的名称是:" + name);
return name;
}
@Override
public void triggerFired(Trigger trigger, JobExecutionContext context) {
String name = trigger.getKey().getName();
System.out.println(name + "被触发了!");
}
@Override
public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context) {
String name = trigger.getKey().getName();
System.out.println(name + "没有被触发!");
return true; // true:表示不会执行job的方法。
}
@Override
public void triggerMisfired(Trigger trigger) {
String name = trigger.getKey().getName();
System.out.println(name + "错过触发!");
}
@Override
public void triggerComplete(Trigger trigger, JobExecutionContext context,
CompletedExecutionInstruction triggerInstructionCode) {
String name = trigger.getKey().getName();
System.out.println(name + "完成之后触发!");
}
}
リスナーを追加します。2.
2.1グローバルリスナーの追加
// 创建并注册一个全局TriggerListener
scheduler.getListenerManager().addTriggerListener(new MyTriggerListener(),EverythingMatcher.allTriggers());
2.2ローカル・リスナーを追加します
// 创建并注册一个局部TriggerListener
scheduler.getListenerManager().addTriggerListener(new MyTriggerListener(), KeyMatcher.keyEquals(TriggerKey.triggerKey("trigger1")));
完全なコール:
package cn.bjc.quartz.main;
import java.util.Date;
import java.util.concurrent.ScheduledFuture;
import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.matchers.EverythingMatcher;
import org.quartz.impl.matchers.KeyMatcher;
import cn.bjc.quartz.job.HelloJobListener;
import cn.bjc.quartz.listener.MyJobListener;
import cn.bjc.quartz.listener.MyTriggerListener;
public class TriggerListenerDemo {
public static void main(String[] args) throws Exception {
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
// 2. 任务实例(JobDetail),通过JobBuilder创建
JobDetail jobDetail = JobBuilder.newJob(HelloJobListener.class)
.withIdentity("job1", "group1")
.usingJobData("msg", "日志打印")
.usingJobData("count", 0)
.build();
// 3. 触发器(Trigger)
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger1", "group1")
.startNow()
.withSchedule(CronScheduleBuilder.cronSchedule("* * * * * ?")) // 日历每秒执行
.build();
Date startDate = scheduler.scheduleJob(jobDetail, trigger);
// 创建并注册一个全局TriggerListener
//scheduler.getListenerManager().addTriggerListener(new MyTriggerListener(),EverythingMatcher.allTriggers());
// 创建并注册一个局部TriggerListener
scheduler.getListenerManager().addTriggerListener(new MyTriggerListener(), KeyMatcher.keyEquals(TriggerKey.triggerKey("trigger1","group1")));
// 启动
scheduler.start();
}
}
2.5 SchedulerListenerリスナー
重大なイベントが発生した場合SchedulerListenerスケジューラは、ライフサイクルに呼び出されます、スケジューラ関連のイベントが含まれます:スケジューラをオフにし、時間スケジューラ、重大なエラーが発生し、仕事/トリガを削除し、仕事/トリガーを増やします。
2.5.1 SchedulerListenerインタフェース・メソッド
1. jobschedulerの(トリガートリガー):JobDetailの展開を呼びかけます
2. jobUnscheduled(文字列triggerName、列triggerGroup):アンインストールJobDetailを呼び出すために使用
3. triggerFinalized(トリガートリガー):トリガー状態は、このメソッドを呼び出したときにトリガ来たことはありません。ジョブが設定されていない限り、永続的になった、またはそれがスケジューラから削除されます。
4. triggersPaused(文字列triggerName、列triggerGroup):スケジューラが一時停止されたトリガ又はトリガグループでは、この方法が発生呼び出します。トリガーグループ場合は、その後triggerName引数はnullになります。
5. triggersResumed(文字列triggerName、列triggerGroup):スケジューラは、トリガ又はトリガ・グループが一時停止されたときにこのメソッドが発生呼び出します。トリガーワードのグループに参加し、triggerNameパラメータはnullになります
6. jobsPaused(文字列triggerName、列triggerGroup):ジョブが一時停止または呼び出しに時間が設定されている場合
7. jobsResumed(文字列triggerName、列triggerGroup):ときにジョブまたは懸濁液からの回復のセットと呼ばれます。ジョブグループに参加し、ジョブ名引数がnullになります。
8. schedulerError(文字列MSG、SchedulerExceptionの原因):スケジューラー、通常動作時に、重大なエラーが生じ呼び出します
9. schedulerStarted():ときスケジューラオープンコール
10. schedulerInStandbyMode():スケジューラがスタンバイモードにあるとき、メソッドが呼び出されます。
11. schedulerShutdown():スケジューラが停止されたときに呼び出されます
12. schedulingDataCleared():データは、スケジューラの呼び出しクリアされます
2.5.2スケジューラーリスナーを使用します
1.カスタムスケジューラリスナー
package cn.bjc.quartz.listener;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.SchedulerException;
import org.quartz.SchedulerListener;
import org.quartz.Trigger;
import org.quartz.TriggerKey;
public class MySchedulerListener implements SchedulerListener{
@Override
public void jobScheduled(Trigger trigger) {
String name = trigger.getKey().getName();
System.out.println(name + "部署的时候调用!");
}
@Override
public void jobUnscheduled(TriggerKey triggerKey) {
String name = triggerKey.getName();
System.out.println(name + "卸载JobDetail时调用!");
}
@Override
public void triggerFinalized(Trigger trigger) {
String name = trigger.getKey().getName();
System.out.println(name + "被移除调用!");
}
@Override
public void triggerPaused(TriggerKey triggerKey) {
String name = triggerKey.getName();
System.out.println(name + "正在被暂停!");
}
@Override
public void triggersPaused(String triggerGroup) {
System.out.println("触发器组" + triggerGroup + "正在被暂停!");
}
@Override
public void triggerResumed(TriggerKey triggerKey) {
String name = triggerKey.getName();
System.out.println(name + "正在被恢复!");
}
@Override
public void triggersResumed(String triggerGroup) {
System.out.println("触发器组" + triggerGroup + "正在被恢复!");
}
@Override
public void jobAdded(JobDetail jobDetail) {
String name = jobDetail.getKey().getName();
System.out.println(name + "添加工作任务的时候调用!");
}
@Override
public void jobDeleted(JobKey jobKey) {
String name = jobKey.getName();
System.out.println(name + "删除工作任务的时候调用!");
}
@Override
public void jobPaused(JobKey jobKey) {
String name = jobKey.getName();
System.out.println(name + "暂停工作任务的时候调用!");
}
@Override
public void jobsPaused(String jobGroup) {
System.out.println("job组" + jobGroup + "暂停的时候调用!");
}
@Override
public void jobResumed(JobKey jobKey) {
System.out.println("工作任务恢复!");
}
@Override
public void jobsResumed(String jobGroup) {
System.out.println("工作组任务恢复!");
}
@Override
public void schedulerError(String msg, SchedulerException cause) {
System.out.println("调用出错,错误信息是:" + msg + " 具体错误原因是:" + cause.getUnderlyingException());
}
@Override
public void schedulerInStandbyMode() {
System.out.println("调度器被挂起模式的时候调用!");
}
@Override
public void schedulerStarted() {
System.out.println("调度器开启的时候调用!");
}
@Override
public void schedulerStarting() {
System.out.println("调度器正在开启的时候调用!");
}
@Override
public void schedulerShutdown() {
System.out.println("调度器关闭的时候调用!");
}
@Override
public void schedulerShuttingdown() {
System.out.println("调度器正在关闭的时候调用!");
}
@Override
public void schedulingDataCleared() {
System.out.println("当scheduler中的数据被清除的时候调用!");
}
}
リスナーを追加します。2.
scheduler.getListenerManager().addSchedulerListener(mySchedulerListener);
電話番号:
package cn.bjc.quartz.main;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import cn.bjc.quartz.job.HelloJobListener;
import cn.bjc.quartz.listener.MySchedulerListener;
public class SchedulerListenerDemo {
public static void main(String[] args) throws Exception {
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
// 2. 任务实例(JobDetail),通过JobBuilder创建
JobDetail jobDetail = JobBuilder.newJob(HelloJobListener.class)
.withIdentity("job1", "group1")
.usingJobData("msg", "日志打印")
.usingJobData("count", 0)
.build();
// 3. 触发器(Trigger)
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger1", "group1")
.startNow()
.withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(5)
.withRepeatCount(2)) // 5秒后重复执行,只重复执行4次
.build();
scheduler.scheduleJob(jobDetail, trigger);
MySchedulerListener mySchedulerListener = new MySchedulerListener();
// 注册监听器
scheduler.getListenerManager().addSchedulerListener(mySchedulerListener);
// 移除监听
// scheduler.getListenerManager().removeSchedulerListener(mySchedulerListener);
// 启动
scheduler.start();
Thread.sleep(8000);
scheduler.shutdown();
}
}