3-- frame timing of the timer Quartz2

1. Resource SchedulerFactory

1.1 Introduction

        Quartz building blocks in a way, therefore, to make it run, several components must be well snap together, fortunately, have some of the existing Assistant can complete these tasks, all Scheduler instances created by SchedulerFactory.

        Quartz three core concepts: the relationship between the scheduler, tasks, triggers, three

SchedulerFactory ——> Scheduler ——> Trigger/job

        SchedulerFactory interface has two subclasses, one StdSchedulerFactory, and the other is DirectSchedulerFactory, before we use are StdSchedulerFactory.

        A job, is more important three elements Scheduler, JobDetail, Trigger, and the like Job Trigger for a drive, not to trigger timing driver job, the job will not run, for the Job, it can correspond to a plurality of Job trigger, trigger for single, a trigger can only correspond to a job, so that a trigger can only be assigned to a job, so if we need to trigger a complex plan, you can create multiple trigger and assign them to a job with.

1.2 Scheduler to create a way

1.2.1 StdSchedulerFactory

        Quartz default SchedulerFactory.

1. a set of parameters (the java.util.Properties) to create and initialize Quartz scheduler.

2. In the configuration parameters are typically stored quartz.properties file.

3. Call getScheduler method will be able to create and initialize the object dispatcher. E.g:

// Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
SchedulerFactory s = new StdSchedulerFactory();
Scheduler scheduler = s.getScheduler();

Note: see the source code to know, StdSchedulerFactory.getDefaultScheduler (); the internal implementation of this method is to use.

1.2.2 Scheduler 的 API

1. Get the start time scheduler

Date startDate = scheduler.scheduleJob(jobDetail, trigger);

2. Start the task scheduling

scheduler.start();

3. task scheduling hang, suspended

scheduler.standby();

4. Close the Task Scheduler

scheduler.shutdown();

scheduler.shutdown (true): After waiting represent all job being executed is finished, and then close the Scheduler

scheduler.shutdown (false): represents a direct closed Scheduler

1.3 DirectSchedulerFactory

        DirectSchedulerFactory is a direct implementation of SchedulerFactory can be constructed Scheduler, Threadpool and other directly through it.

DirectSchedulerFactory instance = DirectSchedulerFactory.getInstance();
Scheduler scheduler1 = instance.getScheduler();

2. Quartz.properties profile

The default path: quartz-2.3.0 in org.quartz.properties

 Note: If you do not want to use the default configuration file, we can create a new quartz.properties configuration file in the resource directory, write your own configuration information in this file

2.1 Detailed profiles

# 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 Scheduler Properties

1. org.quartz.scheduler.instanceName: used to distinguish between specific scheduling instance, the scheduler can give a name in accordance with the functional purposes.

2. org.quartz.scheduler.instanceId: a scheduler is used to distinguish the instances, allowing any string, but this value must be unique among all scheduler instances, especially in a cluster environment, as the cluster the only key.

Note: If you want Quartz automatically generate the value which can be set to AUTO.

For example: org.quartz.scheduler.instanceId: AUTO

2.1.2 Thread Pool Properties

1. threadCount: the number of threads deal with the job, at least 1, but most of it is best not more than 100 words, on most machines more than 100 becomes very impractical, especially in the case of job execution long time.

2. threadPriority: priority of the thread, a higher priority than the thread priority thread to be implemented. At least 1, at most 10, default 5

3. threadPool.class: org.quartz.ThreadPool a class that implements the interface, Quartz own thread pool implementation class is org.quartz.smpl.SimpleThreadPool

2.1.3 Job Storage Settings

It describes the life cycle of the scheduler instance, Job Trigger and how the information is stored

org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore

2.1.4 plug-in configuration

Quartz plug-in configuration to meet the specific needs of use

2. Listener

        Quartz listener for when the task scheduling, when you are concerned about the incident, can obtain timely notice of the incident. Similar to the e-mail task execution process, and SMS alerts.

        Quartz listeners mainly JobListener, TriggerListener, SchedulerListener three sorts represented similar tasks, triggers, scheduler corresponding to three listeners use.

2.1 Global Listener

Global listeners can receive all event notifications Job / Trigger's

// 创建一个全局的监听器
scheduler.getListenerManager().addJobListener(new MyJobListener(),EverythingMatcher.allJobs());

2.2 Local Listener

Non-Global listener can only receive its registry on the job or trigger event, the job is not registered or trigger will not listen.

// 创建一个局部监听器
scheduler.getListenerManager().addJobListener(new MyJobListener(),KeyMatcher.keyEquals(JobKey.jobKey("job1", "group1")));

2.3 JobListener

        Task scheduling, task-related Job events include: prompt start to perform job, job execution completion warning lamp

Method and Function interface 2.3.1 JobListener

1. getName (): used to obtain the name of JobListener

2. jobToBeExecuted (JobExecutionContext context): Scheduler calls this method to be executed when jobDetail

3. jobExecutionVetoed (JobExecutionContext context): Scheduler is about to be executed in jobDetail, but will call the method was rejected TriggerListener.

4. jobWasExecuted (): Scheduler calls the method is performed after JobDetail.

2.3.2 custom listener a Job

1. Create a listener class

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. Add the listener

2.1 add a global listener

In scheduler.start (); before adding the following code, EverythingMatcher.allJobs () represents all the job

scheduler.getListenerManager().addJobListener(new MyJobListener(),EverythingMatcher.allJobs());

2.2 Adding a local listener, listening specified job

scheduler.getListenerManager().addJobListener(new MyJobListener(),KeyMatcher.keyEquals(JobKey.jobKey("job1", "group1")));

Complete calling code:

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

        Task scheduling, event-related triggers include Trigger: Trigger trigger, the trigger is not firing properly, triggers and so complete.

2.4.1 TriggerListener interface defines the method of

1. getName (): used to get the name of flip-flops

2. triggerField (Trigger trigger, JobExecutionContext context): When Trigger associated with the listener is triggered, execute methods on the Job will be executed, Scheduler to call the method.

3. vetoJobExecution (Trigger trigger, JobExecutionContext context): After Trigger trigger, job going to call this method when executed by the Scheduler, TriggerListener given a choice to veto the implementation of Job. If this method returns true, this Job will be implemented not trigger for this Trigger.

4. triggerMisfired (Trigger trigger): Scheduler calls this method is triggered when Trigger miss, you should be concerned about this method of long duration of logic; when many Trigger missed trigger the emergence of long logic will lead to a domino effect, so you this method should be maintained as much as possible on as small as possible.

5. triggerComplete (Trigger trigger): When Trigger is triggered and completed the execution of Job, Scheduler calls this method.

2.4.2 Customizing a listener TriggerListener

1. Create a listener

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. Add the listener

2.1 Adding a global listener

// 创建并注册一个全局TriggerListener
scheduler.getListenerManager().addTriggerListener(new MyTriggerListener(),EverythingMatcher.allTriggers());

2.2 Adding a local listener

// 创建并注册一个局部TriggerListener
scheduler.getListenerManager().addTriggerListener(new MyTriggerListener(), KeyMatcher.keyEquals(TriggerKey.triggerKey("trigger1")));

Complete call:

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 listeners

        SchedulerListener Scheduler will be called in the life cycle when critical events occur, the Scheduler related events include: increasing a job / trigger, delete a job / trigger, time scheduler serious error occurs, turn off the scheduler.

2.5.1 SchedulerListener interface methods

1. jobScheduler (Trigger trigger): calling for the deployment of JobDetail

2. jobUnscheduled (String triggerName, String triggerGroup): used to invoke the uninstall JobDetail

3. triggerFinalized (Trigger trigger): When a trigger state never came triggered when calling this method. Unless the job has been set became persistent, or it will be removed from the Scheduler.

4. triggersPaused (String triggerName, String triggerGroup): Scheduler calls this method occurs in a Trigger or trigger group was paused. If the Trigger group, then, triggerName argument will be null.

5. triggersResumed (String triggerName, String triggerGroup): Scheduler calls this method occurs when a trigger or trigger group is paused. Join a group of trigger words, triggerName parameter will be null

6. jobsPaused (String triggerName, String triggerGroup): When a job is paused or set the time to call

7. jobsResumed (String triggerName, String triggerGroup): Called when a job or a set of recovery from the suspension. Join a job group, jobName argument will be null.

8. schedulerError (String msg, SchedulerException cause): Scheduler during normal operation, resulting in a serious error when calling

9. schedulerStarted (): When the scheduler open call

10. schedulerInStandbyMode (): when the scheduler is in StandBy mode, the method is called.

11. schedulerShutdown (): Called when the scheduler is stopped

12. schedulingDataCleared (): When the data is cleared scheduler invocation

Use 2.5.2 Scheduler listener

1. Custom Scheduler listeners

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. Add a listener

scheduler.getListenerManager().addSchedulerListener(mySchedulerListener);

Calling code:

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();
	}

}

 

Published 128 original articles · won praise 6 · views 3194

Guess you like

Origin blog.csdn.net/weixin_43318134/article/details/103828248
Recommended