Quartz简介及应用场景


)

1. Quartz介绍

  1. 任务调度框架“Quartz”是OpenSymphony开源组织在Job 
    scheduling领域又一个开源项目,是完全由java开发的一个开源的任务日程管理系统,
    “任务进度管理器”就是一个在预先确定(被纳入日程)的时间到达时,负责执行
    (或者通知)其他软件组件的系统。
    
    
    简单来说就是实现“计划(或定时)任务”的系统,例如:订单下单
    后未付款,15分钟后自动撤消订单,并自 动解锁锁定的商品
    
  2. quartz的应用场景大致分为两类
    例如:CRM系统:
    在凌晨两点将六个月未下单的用户标识为流失客户
    分析
    将客户标识为流失客户—>就是将表列段修改状态—>必须页面触发

  3. 定时定点完成某一操作(数据库操作)

        也就是你不用在前端点击什么操做,而是到时间自动完成操作。
    
  4. 遵循某一规律,循环执行某一操作

     		举个例:	快递
     				一个县	1000
     				一个市	1w
     				一个省份	10w
     							340w
     							
     				订单表		340w		订单历史表
     			我们主要是查看订单是否付款成功,查看物流状态,而一查看不可能从340w中看,
     			如果使用,新建一个订单历史表,查看半小时(因为我们通常查询实在半小时之内)的也就是7w,这样就很省时间了。
    

mysql中复制表的口令: create table t_mvc_book_copy as select *from t_mvc_book where bid<30

注意:类似Quartz这样的还有MyCAT+MySQL的分布式架构。

核心类介绍

在这里插入图片描述
三大核心类 Scheduler(调度器),Trigger(触发器),JObDetail(作业类)。Trigger指定JObDetail什么时候发布任务。

quartz相关表达式
在线生成表达式网址: http://cron.qqe2.com/.

简单触发器

创建一个Quartz项目

创建时和整合mybatis一样,不过要多选择一个Quartz。

在这里插入图片描述

pom导入:

		 <dependency>
		     <groupId>org.quartz-scheduler</groupId>
		     <artifactId>quartz-jobs</artifactId>
		     <version>2.2.1</version>
		 </dependency>
		      切面依赖
		<dependency>
		    <groupId>org.springframework</groupId>
		    <artifactId>spring-aspects</artifactId>
		</dependency>

入门级案例

1.创建一个quarz包,包下Demol.java

Demol.java

	package com.javabz.quartz01.quartz;
	
	import com.javabz.quartz01.job.RamJob;
	import org.quartz.*;
	import org.quartz.impl.StdSchedulerFactory;
	
	import static org.quartz.JobBuilder.newJob;
	
	/**
	 * @author因果
	 * @site www.xiaomage.com
	 * @company xxx公司
	 * @create  2020-12-04 10:21
	 */
	public class Demol {
	
	    public static void main(String[] args) throws SchedulerException {
	        //调度器
	        SchedulerFactory schedulerFactory=new StdSchedulerFactory();
	        Scheduler scheduler = schedulerFactory.getScheduler();
	        //作业类
	        JobDetail jobDetail=newJob(RamJob.class)
	                .withIdentity("job1","goroup1") //标识,
	                .withDescription("this is a job1")
	                .build();
	        //触发器
	        Trigger trigger=(Trigger)TriggerBuilder.newTrigger()
	                .withSchedule(SimpleScheduleBuilder.repeatSecondlyForTotalCount(3,6))
	                .withIdentity("trigger1","group1")
	                .withDescription("this is a trigger1")
	                .build();
	        //调度器组装作业类及触发器
	            //绑定
	            scheduler.scheduleJob(jobDetail,trigger);
	            //启动
	            scheduler.start();
	
	    }
	}

2.创建一个job包,包下RamJob

	package com.javabz.quartz01.job;
	
	import org.quartz.Job;
	import org.quartz.JobExecutionContext;
	import org.quartz.JobExecutionException;
	
	/**
	 * @author因果
	 * @site www.xiaomage.com
	 * @company xxx公司
	 * @create  2020-12-04 10:25
	 */
	public class RamJob implements Job {
	    @Override
	    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
	        System.out.println("定时任务具体执行的业务逻辑。。。");
	    }
	}

最终执行,是没6秒指定一次,自行三次,触发器设定的。

在这里插入图片描述

表达式触发器

表达式触发器:定时定点完成。

在简单触发器的基础上修改一下触发器

 //触发器
	        Trigger trigger=(Trigger)TriggerBuilder.newTrigger()
	               .withSchedule(CronScheduleBuilder.cronSchedule("0 57 10 * * ?"))
	                .withIdentity("trigger1","group1")
	                .withDescription("this is a trigger1")
	                .build();

效果图:

在这里插入图片描述

表达式触发器:循某一规定循环执行,不限次数

			按照上面的代码不变,修改规则
		  .withSchedule(CronScheduleBuilder.cronSchedule("0/10 * * * * ?”))
		  每10秒执行一次。

定时任务参数传递问题

在作业类下设置参数,

Demo.java

	 //作业类
	        JobDetail jobDetail=newJob(RamJob.class)
	                .withIdentity("job1","goroup1") //标识,
	                .withDescription("this is a job1")
	                .build();
	        //传参
	        JobDataMap jobDataMap=jobDetail.getJobDataMap();
	        jobDataMap.put("name","注释fod");
	        jobDataMap.put("age",11);
	        jobDataMap.put("sex","男");

在RamJob.java中拿

	public class RamJob implements Job {
	    @Override
	    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
	        System.out.println("定时任务具体执行的业务逻辑。。。");
	        JobDataMap jobDataMap = jobExecutionContext.getJobDetail().getJobDataMap();
	        System.out.println(jobDataMap.get("name").toString() + ":" + jobDataMap.get("age").toString() +":"+ jobDataMap.get("sex").toString());
	    }
	}

在这里插入图片描述

String task Vs Quartz

Spring task

优点:无需整合spring,作业类中就可以调用业务service
缺点:单线程;不能做数据存储型的定时任务

SpringTask.java

运行10秒是多线程,30是单线程。

	package com.javabz.quartz01.task;
	
	import org.springframework.scheduling.annotation.Scheduled;
	import org.springframework.stereotype.Component;
	
	import java.text.SimpleDateFormat;
	import java.util.Date;
	
	/**
	 * @author因果
	 * @site www.xiaomage.com
	 * @company xxx公司
	 * @create  2020-12-04 12:16
	 */
	@Component
	public class SpringTask {
	
	    @Scheduled(cron = "0/10 * * * * ?")
	    public void xxx(){
	        System.out.println("spring 框架自带的定时任务。。。。");
	        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	        System.err.println(format.format(new Date())+" : 这是一个spring task...");
	
	        try {
	            Thread.sleep(20*1000);
	            System.out.println("模拟正在处理大数据....");
	        } catch (InterruptedException e) {
	            e.printStackTrace();
	        }
	    }
	}

在这里插入图片描述

Quartz

优点:多线程;可以做数据存储型的定时任务,维护性高;
缺点:需要整合spring,不能直接调用业务层service;

Demol4.java

	package com.javabz.quartz01.quartz;
	
	import com.javabz.quartz01.job.RamJob;
	import org.quartz.*;
	import org.quartz.impl.StdSchedulerFactory;
	
	import static org.quartz.JobBuilder.newJob;
	
	/**
	 * @author因果
	 * @site www.xiaomage.com
	 * @company xxx公司
	 * @create  2020-12-04 14:25
	 */
	public class Demol4 {
	    public static void main(String[] args) throws SchedulerException {
	        SchedulerFactory factory = new StdSchedulerFactory();
	//        调度器创建
	        Scheduler scheduler = factory.getScheduler();
	
	//        具体定时任务需要执行的代码
	        JobDetail jobDetail = newJob(RamJob.class)
	                .withIdentity("job2", "group1")
	                .withIdentity("这是一个作业类案例")
	                .build();
	
	        Trigger trigger = (Trigger) TriggerBuilder.newTrigger()
	//                每10s执行一次
	                .withSchedule(CronScheduleBuilder.cronSchedule("0/10 * * * * ?"))
	//                触发器标识
	                .withIdentity("trigger2", "group1")
	                .withDescription("这是一个触发器")
	                .build();
	
	//       调度工厂绑定作业类及触发器
	        scheduler.scheduleJob(jobDetail, trigger);
	        scheduler.start();
	    }
	}

jop包下

	 @Override
	    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
	        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	        System.err.println(format.format(new Date())+" : 基于RAM的quartz调度框架定时任务...");
	
	        try {
	            Thread.sleep(20*1000);
	            System.out.println("模拟正在处理大数据....");
	        } catch (InterruptedException e) {
	            e.printStackTrace();
	        }
	    }

运行,10秒是多线程

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值