任务调度框架Quartz+整合spring

Quartz

  1. quartz是什么
  2. quartz的核心API
  3. 使用代码测试quartz(单机版)
  4. quartz的cron表示式
  5. 整合spring

一.quertz是什么?

官方网站:http://www.quertz-scheduler.org/
Quartz是一个功能丰富的开源作业调度框架,几乎可以与任何java应用集成,小到单 体应用,大到大型电子商务系统。
Quartz可以用来创建和执行成千上万的简单或复杂的调度任务;
Quartz的任务被定义为一组标准的java组件,几乎可以执行任何编程任务;
他可以定时发送邮件、短信通知等;也可以定时做数据同步;也可以去确定一些特殊的日期 如母亲节(每年五月的第二个星期天 可以运用他的cron表达式可以精确到那一天 并执行一些任务操作 )

二.Quertz的核心Api

  1. Job:Quartz任务需要实现的接口
  2. JobDetail:用户定义务实例
  3. JobBuilder:创建JobDetail
  4. Trigger
  • SimpleTrigger:可以定义任务每隔多久执行 执行多少次 什么时候开始 什么时候结束
  • CronTrigger:使用Cron表达式可以定义任意的执行时间
  1. TriggerBuilder:用于创建Trigger
  2. TriggerKey:Trigger的唯一标识
  3. Scheduler:调度器,使用Trigger定义的调度规则去执行Job任务
  4. JobKey:任务的唯一标识
  5. JobExecutionContext:任务执行上下文,可以从使用它获取JobDetail、Trigger等
  6. JobDataMap:用于JobDetail和Trigger给任务传参

三.使用代码测试SimpleTrigger

大体框架 [ 三大要素(JobDetail、Trigger、Scheduler)]

![(https://img-blog.csdnimg.cn/20200326215113309.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjA3MTIzNg==,size_16,color_FFFFFF,t_70)

3.1 引入maven依赖
<!-- 引入quertz依赖 2.3.0为目前最高版本-->
  	 <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>2.3.0</version>
    </dependency>
3.2 创建HelloJob任务:要实现Job接口
public class HelloJob {
	//方法名自定义
	public void execute(){
		SimpleDateFormat dateFormat =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		System.out.println(dateFormat.format(new Date())+"-Hello  Spring");	
	}	
}

3.3 创建JobDetail Trigger Scheculer 执行调度 测试SimpleTrigger
public class FirstMain {

	public static void main(String[] args) throws SchedulerException {
		//1.使用jobBuider创建JobDetail  反射创建
		JobDetail jobDetail=JobBuilder.newJob(HelloJob.class)
		.withIdentity("hello","hello").build();
		
		//2.使用TriggerBuilder创建Trigger
		SimpleTrigger trigger=TriggerBuilder.newTrigger().withIdentity("hello","hello")
		.startNow()//任务立即执行
		.withSchedule(SimpleScheduleBuilder.simpleSchedule()
				.withIntervalInSeconds(5)//五秒执行一次
				.repeatForever())//永远执行
				.build();//调度规则
		//3.使用StdSchedulerFactory 创建Scheduler
		Scheduler scheduler=StdSchedulerFactory.getDefaultScheduler();				
		scheduler.scheduleJob(jobDetail,trigger);
		scheduler.start();	
	}
}
3.4 创建JobDetail Trigger Scheculer 执行调度 测试CronTrigger
public class CronTest {

	public static void main(String[] args) throws SchedulerException {
		//1.创建jobDetail
		//唯一表示
		JobKey jobId=new JobKey("helo","hello");
		JobDetail jobDetail=JobBuilder.newJob(HelloJob.class)
		.withIdentity(jobId).build();		
		//2.创建trigger
		TriggerKey triggerKey =new TriggerKey("hello","hello");//唯一标志
		CronTrigger trigger=TriggerBuilder.newTrigger()
				.withIdentity(triggerKey)
		.withSchedule(//表示每天的十点44分开始执行 每十秒钟执行一次  
				CronScheduleBuilder.cronSchedule("0/10 44 10 * * ?")
				)
		.build();			
		//3.创建scheduler
		Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
		scheduler.scheduleJob(jobDetail,trigger);
		scheduler.start();		
	}
}

执行结果
在这里插入图片描述

四.Quertz中的cron表達式

  1. Quartz Cron表达式用于配置CronTrigger实例
  2. Quartz Cron表达式由7个子表达式组成,用于描述时间的各个细节,这些表达式用空格分隔
    在这里插入图片描述
    符号说明:
    在这里插入图片描述

在这里插入图片描述

五. Quartz整合spring(xml版+注解版)

在这里插入图片描述
没整合spring,创建JobDetail、Trigger、Scheduler 整合Spring,还是需要创建JobDetail、Trigger和Scheduler 哈哈哈哈哈

运用一下工厂类来创建

  1. MethodInvokingJobDetailFactoryBean 创建JobDetail 好处:不用实现实现任何接口
  • 要配置的属性:
    name group
    targetObject:任务类-不是Class对象,而是一个spring bean
    targetMethod:要执行的方法
  1. CronTriggerFactoryBean 创建Trigger
  • 要配置的属性:
    name、group、jobDetail、cronExpression
    3. SchedulerFactoryBean 创建Scheduler
5.1引入maven依赖
 	<!-- 引入quertz依赖 -->
 	<dependency>
         <groupId>org.quartz-scheduler</groupId>
         <artifactId>quartz</artifactId>
         <version>2.3.0</version>
     </dependency>
     
      <!-- spring-context-support  依赖spring-context 就spring-context就不用引入了 -->
      <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>spring-context-support</artifactId>
         <version>5.2.2.RELEASE</version>
     </dependency>  
     
      <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>spring-jdbc</artifactId>
         <version>5.2.2.RELEASE</version>
     </dependency>  
       <!-- tx -->
       <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>spring-tx</artifactId>
         <version>5.2.2.RELEASE</version>
     </dependency>  
     
5.2 xml版Quertz整合spring (配置JobDetail、Trigger、Scheduler)
5.2.1 配置spring.xml
<!-- 配置任务类 -->
	<bean id="helloJob" class="com.etoak.job.HelloJob"></bean>
	
	<!-- methodInvokingJobDetailFactoryBean -->
	<bean id="helloJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
		<property name="name" value="hello"/>
		<property name="group" value="hello" />
		<property name="targetObject" ref="helloJob" />
		<property name="targetMethod"  value="execute"></property>
	</bean>
	<!-- CroTriggerFactoryBean -->
	<bean id="helloTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
		<property name="name" value="hello" />
		<property name="group" value="hello" />
		<property name="cronExpression" value="*/5 * * * * ?" />
		<property name="jobDetail" ref="helloJobDetail" />
	</bean>
	
	<!-- SchedulerFactroyBean -->
	<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="triggers">
			<list>
				<ref bean="helloTrigger" />	
			</list>
		</property>
	</bean>
5.2.2 配置任务类
public class HelloJob {
	//方法名自定义  测试 随便打印一句话
	public void execute(){
		SimpleDateFormat dateFormat =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		System.out.println(dateFormat.format(new Date())+"-Hello  Spring");	
	}	
}
5.2.3 测试
public class XmlQuertzMain {
	public static void main(String[] args) {
		//xml得方式的整合得quertz
		new ClassPathXmlApplicationContext("spring.xml");
	}
}

5.3 整合注解版的spring

5.3.1 引入依赖 见上方xml的maven依赖
5.3.2 配置注解版的Quertz容器
@Configuration
public class QuertzConfig {
	//注册job任务
	@Bean
	public HelloJob helloJob() {
		return new HelloJob();
	}
	//注册MethodTnvokingJobDetailFactoryBean
	@Bean
	public MethodInvokingJobDetailFactoryBean helloJobDetail() {
		MethodInvokingJobDetailFactoryBean jobDetail=new MethodInvokingJobDetailFactoryBean();
		jobDetail.setName("hello");
		jobDetail.setGroup("hello");
		jobDetail.setTargetObject(this.helloJob());
		jobDetail.setTargetMethod("execute");
		return jobDetail;
	}
	
	//注册CroTriggerFactoryBean
	@Bean
	public CronTriggerFactoryBean helloTrigger() {
		CronTriggerFactoryBean trigger = new CronTriggerFactoryBean();
		trigger.setName("hello");
		trigger.setGroup("hello");
		trigger.setCronExpression("0/3 * * * * ?");
		trigger.setJobDetail(this.helloJobDetail().getObject());
		return trigger;
	}
	
	//注册SchedulerFactoryBean
	@Bean
	public  SchedulerFactoryBean  scheduler() {
		SchedulerFactoryBean factory = new SchedulerFactoryBean();	
		factory.setTriggers(this.helloTrigger().getObject());
		return factory;
	}
	
}

5.3.3 测试注解版
public class JavaConfig {
	public static void main(String[] args) {
		new AnnotationConfigApplicationContext(QuertzConfig.class);
	}
}

发布了2 篇原创文章 · 获赞 1 · 访问量 35
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 1024 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览