Spring 集成quartz框架的两种方式

Java项目中常使用的定时器有JDK Timer、Quartz、Spring Task等三种。Quartz的功能强大,配置也比较复杂,适合大型、多定时任务的项目使用。Spring Task配置较为简单轻量,需要Spring框架支持。JDK自带的定时器Timer使用灵活,配置简单,适合中小型项目。这里记录下quartz方式

一、Quartz作业类的继承方式来讲,可以分为两类:

  1. 作业类需要继承自特定的作业类基类,如Quartz中需要继承自org.springframework.scheduling.quartz.QuartzJobBean;
  2. 作业类即普通的java类,不需要继承自任何基类。

使用QuartzJobBean,需要继承,而且在注入Spring容器中其他service时候需要在schedulerContextAsMap中注入,比较麻烦,否则不能成功(具体操作参考:https://blog.csdn.net/whaosy/article/details/6298686)。

使用MethodInvokeJobDetailFactoryBean则需要指定targetObject(任务实例)和targetMethod(实例中要执行的方法),可以方便注入Spring容器中其他的service。后者优点是无侵入,业务逻辑简单。所以我更推荐的第二种!

 

二、从任务调度的触发时机来分,这里主要是针对作业使用的触发器,主要有以下两种:

  1. 每隔指定时间则触发一次,在Quartz中对应的触发器为:org.springframework.scheduling.quartz.SimpleTriggerBean
  2. 每到指定时间则触发一次,在Quartz中对应的调度器为:org.springframework.scheduling.quartz.CronTriggerBean

三、下面针对两种分别讲解

1.作业类继承自特定的基类:org.springframework.scheduling.quartz.QuartzJobBean

package com.summer.job;

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.quartz.QuartzJobBean;
import org.springframework.stereotype.Component;

import com.summer.opendoor.service.OpenDoorService;

//@Component
public class Job extends QuartzJobBean{
	
	public Job() {
		super();
		System.out.println("JOB初始化");
	}

	@Autowired
	private OpenDoorService openDoorService;

	@Override
	protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
		System.out.println("JOB任务执行了");
		//如果没有在schedulerContextAsMap中注入openDoorService ,则这里是null  
		//openDoorService.open();
	}

}

注意图片红框中的引用,分三步,先定义jobDetail,然后定义触发器,最后是调度工厂

Spring 集成quartz框架的两种方式_第1张图片

 



	
	
	
	
		
		
	

	
	
		
		
		
		
		
	

	
	
	
		
		
			
				
			
		
	

2.作业类不继承特定基类   强烈推荐这种

 

package com.summer.job;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.summer.opendoor.service.OpenDoorService;

@Component
public class JobMethodInvoke{
	
	public JobMethodInvoke() {
		super();
		System.out.println("JobMethodInvoke初始化");
	}

	@Autowired
	private OpenDoorService openDoorService;

	
	protected void doSomething() {
		System.out.println("JOB任务执行了");
		openDoorService.open();
	}

}

注意中间的引用关系,如下图

 

Spring 集成quartz框架的两种方式_第2张图片

 




	
	
	
	
	
		
		
		
		
		
	

		
	
		
	
	
	
		
		
		
		
	
	
	
		
			
				
				
			
		
	

 

 

你可能感兴趣的:(java)