Quartzタイミングタスクフレームワーク(二)Quartz詳細

9938 ワード

目次
Quartz API
Schedulerスケジューラ、SchedulerFactoryスケジューラファクトリ
schedulerスケジューラ
SchedulerFactory
Job & JobDetail
JobDataMap
Jobインスタンス化プロセス
jobの注釈宣言と同時実行
jobのその他の属性
Triggerトリガ
優先順位Priority
 

Quartz API

  • Scheduler:スケジューラと対話するメインインタフェース
  • Job:スケジューラによって実行される拡張インタフェースであり、executeメソッドではjobの具体的な動作
  • が実行される.
  • JobDetail:jobsを定義するインスタンス
  • Trigger:タスクが
  • をトリガーするタイミングを設定するスケジューラ上のjobの実行時間を定義します.
  • JobBuilder:JobDetailインスタンスを作成または定義するための
  • TriggerBuilder:Triggerインスタンスを作成するための
  • Schedulerスケジューラ、SchedulerFactoryスケジューラファクトリ


    schedulerスケジューラ


    SchedulerはjobDetailsとtriggersのレジストリを維持し、時間が経つとjob実行をトリガーします.
    スケジューラSchedulerは、SchedulerFactoryファクトリで作成できます.作成したSchedulerは、SchedulerFactoryで取得できます.
    Scheduler作成後は待機状態のみでschedulerを呼び出す.start()メソッド起動、scheduler.shutdownメソッドが閉じ、isShutdownがステータスをチェックします.
    SchedulerはscheduleJobメソッドを呼び出してjobをスケジューリングに追加し、startメソッドの実行後にjob実行をトリガーします.

    SchedulerFactory


    SchedulerFactoryには、DirectSchedulerFactoryとStdSchedulerFactoryの2つのデフォルトの実装クラスがあります.
    * DirectSchedulerFactory
    DirectSchedulerFactoryはorgですquartz.SchedulerFactoryの一例実装.ここには、DirectSchedulerFactoryを使用するコード・セグメントの例があります.例1:createVolatileSchedulerメソッドを使用して、データベースに書き込む必要のないスケジューラ・インスタンスを作成できます.
    // 10 
    DirectSchedulerFactory.getInstance().createVolatileScheduler(10);  
    // 
    DirectSchedulerFactory.getInstance().getScheduler().start();

    もう1つ、作成方法:
    public void createScheduler(String schedulerName, String schedulerInstanceId, ThreadPool threadPool, JobStore jobStore, String rmiRegistryHost, int rmiRegistryPort)

    サンプルコード:
    //  
    SimpleThreadPool threadPool = new SimpleThreadPool(maxThreads, Thread.NORM_PRIORITY); 
    threadPool.initialize(); 
    
    //  job 
    JobStore jobStore = new RAMJobStore();
    
    // 
    DirectSchedulerFactory.getInstance().createScheduler("My Quartz Scheduler", "My Instance", threadPool, jobStore, "localhost", 1099); 
    
    //  start() 
    DirectSchedulerFactory.getInstance().getScheduler("My Quartz Scheduler", "My Instance").start();

    jdbcjobstoreも使用できます
    DBConnectionManager.getInstance().addConnectionProvider("someDatasource", new JNDIConnectionProvider("someDatasourceJNDIName"));
    
    JobStoreTX jdbcJobStore = new JobStoreTX(); jdbcJobStore.setDataSource("someDatasource"); jdbcJobStore.setPostgresStyleBlobs(true); jdbcJobStore.setTablePrefix("QRTZ_"); jdbcJobStore.setInstanceId("My Instance");

    * StdSchedulerFactory 
    StdSchedulerFactoryはorg.quartz.Quartzプロパティファイルに基づいてQuartz Schedulerスケジューラを作成するSchedulerFactoryの実装クラス.以前のエントリー・ケースでは、プロパティ・ファイルquartzを指定したため、StdSchedulerFactoryが使用されていました.properties.
    デフォルトでは、現在の作業ディレクトリの「quartz」がロードされます.propertiesプロパティファイル.ロードに失敗するとorg/quartzパッケージの「quartz.propertiesプロパティファイル.JD-GUI逆コンパイルツールを使用してquartzを開きます.JAr、org/quartzパッケージの下でデフォルトのプロパティファイルの構成情報を見つけることができます
    デフォルトのquartz.propertiesの構成情報
    # 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
    
    

    Job & JobDetail


    Jobはタスクの実行動作を定義するために使用され、JobDetailはschedulerがjobに対応する様々な属性を作成し、通知するために使用され、JobDetailはJobBuilderを使用する.NewJobは作成され、作成時にjobの実装タイプを知らなければならない.
    タスクJobには名前nameとグループグループグループが関連付けられています.1つのSchedulerの中でこの2つの組み合わせは唯一でなければならない.
    トリガタスク計画実行テーブルの実行メカニズム」.複数のトリガは同じ作業を指すことができますが、1つのトリガは1つの作業のみを指すことができます.
     JobDetail job = JobBuilder.newJob (HelloJob.class).withIdentity("job1", "group1")
                    .build();
    public class HelloJob implements Job{
    	public HelloJob(){}
    	@Override
    	public void execute(JobExecutionContext paramJobExecutionContext)
    			throws JobExecutionException {
    		 System.err.println("["+Thread.currentThread().getName()+"]"+"Hello World!  MyJob is executing.");
    	}
    }

    schedulerがjobを実行するたびにexecuteメソッドに新しいインスタンスが作成され、jobが実行したらそれを回収処理します.
    デフォルトのSchedularFactoryインプリメンテーションを使用する場合、Jobのインプリメンテーションクラスにはパラメータのないコンストラクタが必要です.
    Jobの実装クラスでは、タスクの実行中に値を保持できないため、いくつかのステータス変数を定義しても意味がありません.実行するたびに新しいjobインスタンスが作成され、実行が完了すると破棄されるためです.

    JobDataMap


    JobDataMapは、JobDetailエンティティの一部であり、実行中のJobの状態を把握し、job実行中に使用可能なデータを格納するために使用されます.
    JobDataMapはmapの実装クラスであり、元のタイプのデータを格納および取得する方法を提供します.
    1.ジョブ・スケジュールにジョブを追加する前に、ジョブ・データベースの作成時にジョブ・データベースにデータを配置できます.
    Trigger trigger = TriggerBuilder.newTrigger()
                    .withIdentity("trigger1", "group1")
                    .usingJobData("name", "hello world! ")//usingJobData jobDataMap 
                    .usingJobData("age", 110l)
                    .usingJobData("flag", false)
                    .startNow()
                    .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                            .withIntervalInSeconds(1)
                            .repeatForever())            
                    .build();

    2.ジョブの実行中にデータを取り出す
    public class HelloJob implements Job{
    	public HelloJob(){}
    	@Override
    	public void execute(JobExecutionContext context)
    			throws JobExecutionException {
    		 JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
    		 String name = jobDataMap.getString("name");
    		 long age = jobDataMap.getLong("age");
    		 boolean flag = jobDataMap.getBoolean("flag");
    		 System.out.println("name:"+name+",age:"+age+",flag:"+flag);
    		 System.err.println("["+Thread.currentThread().getName()+"]"+"Hello World!  MyJob is executing.");
    	}
    }

    jobdataMapに格納されたデータはシーケンス化され、シーケンス化の問題が発生する可能性があります.標準のjavaタイプストレージは安全であることは明らかですが、カスタマイズされたオブジェクトをシーケンス化して保存している場合は、シーケンス化の問題が発生する可能性があります.
    keyと文字列を格納するモードでは、基本タイプのデータを格納するのではなくjavadatamapをデータとして格納することで、シーケンス化の問題を解決できます.
    さらに、Triggerはjobdatamapに関連付けることもでき、複数のTriggerを使用してjobを設定すると、各triggerに対してjobdataMapを介して独立した入力を提供することができる.
    JobExecutionContextによってjavadatamapを取得することができ、jobdetailとtriggerに関連付けられたjavadatamapのマージであり、これによって取得されたjobdataMapはjobDailとTriggerトリガの値を取得することができる.
     Trigger trigger = TriggerBuilder.newTrigger()
                    .withIdentity("trigger1", "group1")
                    .usingJobData("name", "hello world! ")//usingJobData jobDataMap 
                    .usingJobData("age", 110l)
                    .usingJobData("flag", false)
                    .startNow()
                    .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                            .withIntervalInSeconds(1)
                            .repeatForever())            
                    .build();
    public void execute(JobExecutionContext context)
    			throws JobExecutionException {
    		JobDataMap jobDataMap = context.getMergedJobDataMap();
    	}

    Jobインスタンス化プロセス


    jobクラスを作成し、複数のjobDetailを作成できます.各jobDetailには独自の設定とjobdatamapがあり、schedulerスケジューラに追加されます.
    例を挙げると、SalesReportJobのjobクラスを作成し、販売レポートとして使用し、javadatamapで販売レポートの名前と根拠を指定し、SalesReportForJoeやSalesReportForMikなどのjobDetailインスタンスを複数作成できます.
    重要:トリガ時間になると、関連付けられたJobDetailがロードされ、JobFactoryのschedulerの構成に依存してインスタンス化されます.JobFactoryは新しいjobインスタンスを作成し、jobのsetメソッドを呼び出してjobdatamapの対応するkeyに値を設定します.jobFactoryも拡張でき、ioc,diによってjobインスタンスの構築が完了します.

    jobの注釈宣言と同時実行


    @DisallowConcurrentExecution:jobクラスに追加し、quartzにマルチスレッド環境でjobを実行しない複数のインスタンスを通知します.
    この制約はjobクラスではなくjobDetailに基づいていることに注意してください.上のSalesReportJobのjobクラスは、複数のSalesReportFroJoeとSalesReportForMikを定義しています.この2つのjobDetailインスタンスは、マルチスレッド環境では、1つのSalesReportForJoeと1つのSalesReportForMik定義のjobしか実行できないことを意味します.
    @PersistJobDataAfterExecution:executeを1回実行した後、jobdatamapのデータを更新します.これにより、次回executeメソッドを実行し、元の値ではなく更新された値を取得します.
    @P e r s istJobDataAfterExecution注記を使用する場合は、マルチスレッド環境で複数のjobによるデータの問題を回避するために、@D i l l o w C o n currentExecutionを使用することを強くお勧めします.

    jobのその他の属性

  • 永続化-タスクが永続化されていない場合、トリガが関連付けられていない場合、Quartzはschedulerから削除します.
  • リカバリ要求-タスクがリカバリを要求した場合、通常、タスクの実行中にシステムクラッシュまたは他のクローズ・プロセスが発生した場合、サービスが再起動されると、タスクが再実行されます.この場合、JobExecutionContext.isRecovering()はtrue
  • を返します.

    Triggerトリガ


    TriggerBuilderは、トリガTriggerを作成するために使用されます.もしあなたがwithScheduleを呼び出さなかったら(..)メソッドは、デフォルトのscheduleを使用します.使用していない場合はwithIdentity(.)トリガ名が自動的に生成されます.TriggerBuilderを使用してトリガをインスタンス化しながら、いくつかのプロパティを設定できます.
    jobkey:トリガがトリガーされると実行されるjob
    starttime:トリガがトリガを開始した時間
    endtime:トリガがトリガを終了する時間、例えば5日ごとにトリガされ、endtimeは7月1日であり、最後の実行時間は7月5日である.

    優先順位Priority


    プロパティの優先度を設定するのは、starttimeが同じでなければ意味がありません.
    タスクがリカバリを要求すると、リカバリは元の優先度と一致します.
    参照先:http://www.quartz-scheduler.org/documentation/quartz-2.1.x/tutorials/tutorial-lesson-04.html
               https://blog.csdn.net/zixiao217/article/details/53053598