Quartz紹介:タスクスケジューリングフレームワーク

4302 ワード

原文:https://blog.csdn.net/zixiao217/article/details/53015511

Quartzって何?
Quartzはタスクスケジューリングフレームワーク(ライブラリ)であり、特定の時間内にタスクを実行または周期的に実行する場合にタスクスケジューリングフレームワークを使用する必要があるタイミングタスクもあります.Quartzは非常に柔軟であり、複数の使用例(所望の動作を実現するために単独または一緒に使用することができる)を含む.Quartzは非常に軽量級で、非常に少ない配置しか必要ありません.Quartzにはフォールトトレランスメカニズムがあり、サービスを再起動するときにタイミングタスクを永続化できます.
Quartzって何じゃないの?
Quartzはタスクキューではありません.Quartzはグリッド計算エンジンではありません.Quartzは、ビジネスマンに提供される実行サービスではなく、コードライブラリであり、アプリケーションに統合しやすい.
コンポーネントの観点からQuartzは何ですか?
Quartzは軽量級のjavaライブラリで、ほとんどのタイミングの機能が含まれています.メインインタフェースはScheduleで、タスクのスケジュールまたはタスクのキャンセル、タスクの開始または停止などの簡単な操作を提供します.Quartzを使用する場合は、Jobインターフェースを実装する必要があります.execute()メソッドが含まれています.
タスクの実行時間になったときに通知したい場合は、TriggerListenerまたはJobListenerインタフェースを実装する必要があります.
なぜjavaを簡単に使わないのか.util.Timer?
JDK 1から3から、タイマは、java.util.Timerおよびjava.util.TimerTaskによって実現される.Javaの標準機能ではなくQuartzを使用するのはなぜですか?
  • Timersは持続化機構がない.
  • Timersは柔軟ではなく、開始時間と繰返し間隔だけを設定することができ、時間、日付、日など(秒、分、時)に基づく
  • ではない.
  • Timersはスレッドプールを利用できず、1つのTimer 1つのスレッド
  • Timers本当の管理計画がない
  • Quartzはどのくらいのタスクを実行できますか?
    使用状況によります.JobStoreは重要な要素を演じています.RAMベースのJobStoreは、JDBCベースのJobStoreよりも約100倍高速です.JDBC JobStoreの速度は、データベースの接続速度、使用するデータベースシステム、およびデータベースが実行するハードウェアデバイスにほぼ完全に依存します.RAMベースのJobStoreに格納されているJobとTriggersにも制限があり、使用可能なスペースはデータベースのハードディスクよりも小さいに違いありません.
    ジョブについて
    ジョブのインスタンスをどのように制御しますか?org.quartz.spi.JobFactoryおよびorg.quartz.Scheduler.setJobFactory(..)の方法を参照してください.
    ジョブが完了して削除された後も保存できますか?
    属性の設定:JobDetail.setDurability(true); JobにTrigger参照がない場合、QuartzはJobを削除する必要はありません.
    ジョブの同時実行を制御するにはどうすればいいですか?
    StatefulJobを実現します.
    実行中のジョブを停止するにはどうすればいいですか?org.quartz.InterruptableJobインタフェースとScheduler.interrupt(String, String)メソッドを確認します.
    Triggerに関する質問
    タスクチェーン(ワークフロー)の実行方法
    Quartzチェーンを介してタスクを直接トリガする方法はまだありません.
    方法1:
    Listener(TriggerListenerJobListenerまたはSchedulerListener)を使用すると、ある作業が完了したことを通知し、別のタスクを開始できます.この方法は少し複雑で、リスナーにどのタスクがどのタスクに続いているかを知らせなければなりません.org.quartz.listeners.JobChainingJobListenerはすでにいくつかのこのような機能を持っていることを確認することができます.
    方法2:
    ジョブを作成します.JobDataMapには、次のジョブの名前が含まれています.ジョブが完了したら、次のタスクを実行します.
    ほとんどの方法は、基本クラス(通常は抽象クラスまたはインタフェース)をJobとして作成し、定義済みのKeyを使用してJobDataMapからグループ化するJob名を取得する方法を有する.抽象クラス実装execute()メソッドは、後続のジョブをスケジューリングするコードを含むテンプレートメソッド、例えばdoWork()に実行を依頼する.その後、サブクラスがしなければならないのは、自分がすべき仕事をすることを含む簡単な拡張だけです.
    なぜtriggerは実行されなかったのですか?
    一般的な理由は、Scheduler.start()メソッドが呼び出されていない可能性があります.このメソッドは、スケジューラにトリガを起動するように伝えます.もう1つはtriggerまたはtriggerグループが一時停止された可能性があります.
    JDBCJobStoreに関する質問
    JDBC-JobStoreのパフォーマンスを向上させるにはどうすればいいですか?
  • より高速でより良いネットワーク
  • を使用
  • より良いマシン
  • より良いRDBMS
  • 単純で効果的な方法:Quartzテーブルにインデックスを作成する
    最も重要なインデックスのTRIGGERテーブルのnext_fire_time、stateフィールド.
    create index idx_qrtz_t_next_fire_time on qrtz_triggers(NEXT_FIRE_TIME); 
    create index idx_qrtz_t_state on qrtz_triggers(TRIGGER_STATE); 
    create index idx_qrtz_t_nf_st on qrtz_triggers(TRIGGER_STATE,NEXT_FIRE_TIME); 
    create index idx_qrtz_ft_trig_name on qrtz_fired_triggers(TRIGGER_NAME); 
    create index idx_qrtz_ft_trig_group on qrtz_fired_triggers(TRIGGER_GROUP); 
    create index idx_qrtz_ft_trig_name on qrtz_fired_triggers(TRIGGER_NAME); 
    create index idx_qrtz_ft_trig_n_g on qrtz_fired_triggers(TRIGGER_NAME,TRIGGER_GROUP); 
    create index idx_qrtz_ft_trig_inst_name on qrtz_fired_triggers(INSTANCE_NAME); 
    create index idx_qrtz_ft_job_name on qrtz_fired_triggers(JOB_NAME); 
    create index idx_qrtz_ft_job_group on qrtz_fired_triggers(JOB_GROUP); 
    create index idx_qrtz_t_next_fire_time_misfire on qrtz_triggers(MISFIRE_INSTR,NEXT_FIRE_TIME); 
    create index idx_qrtz_t_nf_st_misfire on qrtz_triggers(MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_STATE); 
    create index idx_qrtz_t_nf_st_misfire_grp on qrtz_triggers(MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_GROUP,TRIGGER_STATE);
    

    Quartzクラスタ能力
    クラスタ機能は、ワークセット分割に複数の異なるスケジューラを使用することを考慮して、長時間または密な作業(複数のノードにワークロードを割り当てる)に最適です.
    Quartzは拡張性と高可用性機能を備えています.Quartzの構成資料で答えを見つけることができます.http://www.quartz-scheduler.org/documentation/quartz-2.2.x/configuration/