java框架---->quartz的使用(一)


  Quartz 是個開源的作業調度框架,為在 Java 應用程序中進行作業調度提供了簡單卻強大的機制。今天我們就來學習一下它的使用,這里會分篇章對它進行介紹。只是希望能有個人,在我說沒事的時候,知道我不是真的沒事;能有個人,在我強顏歡笑的時候,知道我不是真的開心。

 

quartz的使用案例

我的測試環境用的是maven,這次的測試代碼是作為一個maven模塊編寫的(可能引用了父模塊的jar依賴),首先添加quartz的依賴。

<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.3.0</version>
</dependency>

項目結構如下:

一、quartz的配置,這個不是必須的但是比較有用

  quartz是可以靈活配置的,而最好的方式就是在應用的classpath上創建quartz.properties文件進行配置。詳細的配置項,可以參考:http://www.quartz-scheduler.org/documentation/quartz-2.1.x/configuration/。下面的內容是我們本次測試的配置。

# This scheduler’s name will be “MyScheduler”.
org.quartz.scheduler.instanceName = MyScheduler
# There are 3 threads in the thread pool, which means that a maximum of 3 jobs can be run simultaneously.
org.quartz.threadPool.threadCount = 3
# All of Quartz’s data, such as details of jobs and triggers, is held in memory (rather than in a database)
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

 

二、開始我們的程序的編寫

package com.linux.huhx.example1;

import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.impl.StdSchedulerFactory;

/**
 * @Author: huhx
 * @Date: 2017-11-23 上午 8:59
 */
public class QuartzTest {
    public static void main(String[] args) {
        try {
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
            scheduler.start();

            scheduler.shutdown();
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }
}

 運行上述的代碼,如果已經配置了日志,可以看到如下的控制台輸出。

09:23:18.593 [main] INFO  org.quartz.impl.StdSchedulerFactory - Using default implementation for ThreadExecutor
09:23:18.624 [main] INFO  o.quartz.core.SchedulerSignalerImpl - Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl
09:23:18.624 [main] INFO  org.quartz.core.QuartzScheduler - Quartz Scheduler v.2.3.0 created.
09:23:18.640 [main] INFO  org.quartz.simpl.RAMJobStore - RAMJobStore initialized.
09:23:18.640 [main] INFO  org.quartz.core.QuartzScheduler - Scheduler meta-data: Quartz Scheduler (v2.3.0) 'MyScheduler' with instanceId 'NON_CLUSTERED'
  Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.
  NOT STARTED.
  Currently in standby mode.
  Number of jobs executed: 0
  Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 3 threads.
  Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.

09:23:18.640 [main] INFO  org.quartz.impl.StdSchedulerFactory - Quartz scheduler 'MyScheduler' initialized from default resource file in Quartz package: 'quartz.properties'
09:23:18.640 [main] INFO  org.quartz.impl.StdSchedulerFactory - Quartz scheduler version: 2.3.0
09:23:18.640 [MyScheduler_QuartzSchedulerThread] DEBUG o.quartz.core.QuartzSchedulerThread - batch acquisition of 0 triggers
09:23:18.640 [main] INFO  org.quartz.core.QuartzScheduler - Scheduler MyScheduler_$_NON_CLUSTERED started.
09:23:18.640 [main] INFO  org.quartz.core.QuartzScheduler - Scheduler MyScheduler_$_NON_CLUSTERED shutting down.
09:23:18.640 [main] INFO  org.quartz.core.QuartzScheduler - Scheduler MyScheduler_$_NON_CLUSTERED paused.
09:23:18.640 [main] DEBUG org.quartz.simpl.SimpleThreadPool - Shutting down threadpool...
09:23:18.640 [main] DEBUG org.quartz.simpl.SimpleThreadPool - Shutdown of threadpool complete.
09:23:18.640 [main] INFO  org.quartz.core.QuartzScheduler - Scheduler MyScheduler_$_NON_CLUSTERED shutdown complete.
09:23:19.109 [MyScheduler_Worker-2] DEBUG org.quartz.simpl.SimpleThreadPool - WorkerThread is shut down.
09:23:19.109 [MyScheduler_Worker-1] DEBUG org.quartz.simpl.SimpleThreadPool - WorkerThread is shut down.
09:23:19.109 [MyScheduler_Worker-3] DEBUG org.quartz.simpl.SimpleThreadPool - WorkerThread is shut down.

  需要注意的一點就是:如果我們通過StdSchedulerFactory.getDefaultScheduler()的方式維護一個調度器,我們的應用不會終止直到scheduler.shutdown()方法被調用。下面我們添加一個簡單的Hello的任務並加以調度。這里面我們提供QuartzTest完整的代碼,我們在調度器開始后,讓程序睡眠10秒。這樣可以在shutdown之前,可以看到HelloJob的調度執行。

package com.linux.huhx.example1;

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

import java.util.concurrent.TimeUnit;

/**
 * @Author: huhx
 * @Date: 2017-11-23 上午 8:59
 */
public class QuartzTest {
    public static void main(String[] args) {
        try {
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
            scheduler.start();

            // define the job and tie it to our HelloJob class
            JobDetail job = JobBuilder.newJob(HelloJob.class)
                    .withIdentity("job1", "group1")
                    .build();

            // 每5秒運行一次job
            Trigger trigger = TriggerBuilder.newTrigger()
                    .withIdentity("trigger1", "group1")
                    .startNow()
                    .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                            .withIntervalInSeconds(5)
                            .repeatForever())
                    .build();

            // Tell quartz to schedule the job using our trigger
            scheduler.scheduleJob(job, trigger);
            TimeUnit.SECONDS.sleep(10);
            scheduler.shutdown();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

我們的HelloJob的代碼比較簡單就是輸出字符串:hello world.

package com.linux.huhx.example1;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

/**
 * @Author: huhx
 * @Date: 2017-11-23 上午 9:02
 */
public class HelloJob implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("hello world.");
    }
}

運行QuartzTest,可以看到如下的日志輸出。由於我們的調度器是每5秒執行一次HelloJob,睡眠10秒之后會執行3次。

09:39:50.488 [main] INFO  org.quartz.impl.StdSchedulerFactory - Using default implementation for ThreadExecutor
09:39:50.519 [main] INFO  o.quartz.core.SchedulerSignalerImpl - Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl
09:39:50.519 [main] INFO  org.quartz.core.QuartzScheduler - Quartz Scheduler v.2.3.0 created.
09:39:50.519 [main] INFO  org.quartz.simpl.RAMJobStore - RAMJobStore initialized.
09:39:50.519 [main] INFO  org.quartz.core.QuartzScheduler - Scheduler meta-data: Quartz Scheduler (v2.3.0) 'MyScheduler' with instanceId 'NON_CLUSTERED'
  Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.
  NOT STARTED.
  Currently in standby mode.
  Number of jobs executed: 0
  Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 3 threads.
  Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.

09:39:50.519 [main] INFO  org.quartz.impl.StdSchedulerFactory - Quartz scheduler 'MyScheduler' initialized from default resource file in Quartz package: 'quartz.properties'
09:39:50.519 [main] INFO  org.quartz.impl.StdSchedulerFactory - Quartz scheduler version: 2.3.0
09:39:50.519 [main] INFO  org.quartz.core.QuartzScheduler - Scheduler MyScheduler_$_NON_CLUSTERED started.
09:39:50.519 [MyScheduler_QuartzSchedulerThread] DEBUG o.quartz.core.QuartzSchedulerThread - batch acquisition of 0 triggers
09:39:50.535 [MyScheduler_QuartzSchedulerThread] DEBUG o.quartz.core.QuartzSchedulerThread - batch acquisition of 1 triggers
09:39:50.535 [MyScheduler_QuartzSchedulerThread] DEBUG o.q.simpl.PropertySettingJobFactory - Producing instance of Job 'group1.job1', class=com.linux.huhx.example1.HelloJob
09:39:50.551 [MyScheduler_QuartzSchedulerThread] DEBUG o.quartz.core.QuartzSchedulerThread - batch acquisition of 1 triggers
09:39:50.551 [MyScheduler_Worker-1] DEBUG org.quartz.core.JobRunShell - Calling execute on job group1.job1
hello world.
09:39:55.520 [MyScheduler_QuartzSchedulerThread] DEBUG o.q.simpl.PropertySettingJobFactory - Producing instance of Job 'group1.job1', class=com.linux.huhx.example1.HelloJob
09:39:55.520 [MyScheduler_QuartzSchedulerThread] DEBUG o.quartz.core.QuartzSchedulerThread - batch acquisition of 1 triggers
09:39:55.520 [MyScheduler_Worker-2] DEBUG org.quartz.core.JobRunShell - Calling execute on job group1.job1
hello world.
09:40:00.521 [MyScheduler_QuartzSchedulerThread] DEBUG o.q.simpl.PropertySettingJobFactory - Producing instance of Job 'group1.job1', class=com.linux.huhx.example1.HelloJob
09:40:00.521 [MyScheduler_QuartzSchedulerThread] DEBUG o.quartz.core.QuartzSchedulerThread - batch acquisition of 1 triggers
09:40:00.521 [MyScheduler_Worker-3] DEBUG org.quartz.core.JobRunShell - Calling execute on job group1.job1
hello world.
09:40:00.536 [main] INFO  org.quartz.core.QuartzScheduler - Scheduler MyScheduler_$_NON_CLUSTERED shutting down.
09:40:00.536 [main] INFO  org.quartz.core.QuartzScheduler - Scheduler MyScheduler_$_NON_CLUSTERED paused.
09:40:00.536 [main] DEBUG org.quartz.simpl.SimpleThreadPool - Shutting down threadpool...
09:40:00.536 [main] DEBUG org.quartz.simpl.SimpleThreadPool - Shutdown of threadpool complete.
09:40:00.536 [main] INFO  org.quartz.core.QuartzScheduler - Scheduler MyScheduler_$_NON_CLUSTERED shutdown complete.
09:40:00.583 [MyScheduler_Worker-2] DEBUG org.quartz.simpl.SimpleThreadPool - WorkerThread is shut down.
09:40:00.615 [MyScheduler_Worker-1] DEBUG org.quartz.simpl.SimpleThreadPool - WorkerThread is shut down.
09:40:01.021 [MyScheduler_Worker-3] DEBUG org.quartz.simpl.SimpleThreadPool - WorkerThread is shut down.

 

友情鏈接

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM