• Quartz实现任务调度


    一、任务调度概述

    在企业级应用中,经常会制定一些“计划任务”,即在某个时间点做某件事情,核心是以时间为关注点,即在一个特定的时间点,系统执行指定的一个操作,任务调度涉及多线程并发、线程池维护、运行时间规则解析、运行现场的保护以恢复等方面。Quartz框架是一个开源的企业级任务调度服务,已经被作为任务调度的良好解决方案


    二、Quartz框架核心概念

    Quartz对任务调度进行了高度抽象,提出了3个核心概念,并在org.quartz包中通过接口和类进行了描述

    任务:就是执行的工作内容。Quartz提供Job接口来支持任务定义

    触发器:定义触发Job执行的时间触发规则。Quartz提供Trigger类及其子类支持触发器功能,

    调度器:Quartz提供了Scheduler接口,将工作任务和触发器绑定,保证任务可以在正确的时间执行


    三、Quartz框架的使用流程

    案例:

    从当前时间开始执行一个特定操作 

    ①:引入jar文件

    ②:创建entity实体层定义任务的模板

    定制一个泛型集合用户存储多个Plan对象,提供一个方法读取该泛型集合中的data

    ④:提醒业务类

    ⑤:真正的任务对象和触发器对象

    步骤一:

    步骤二:Plan实体类,并有对应的时间和任务内容

    public class Plan {
        //时间
    	private String date;
    	
    	//任务
    	private String task;
    	
    	@Override
    	public String toString() {
    		return "Plan [date=" + date + ", task=" + task + "]";
    	}
    
    	
    	public Plan() {
    	}
    
    	public Plan(String date, String task) {
    		super();
    		this.date = date;
    		this.task = task;
    	}
    

    步骤三:定义Service,创建集合,遍历

    public class RemindService {
    
    	//创建一个集合,并且方法返回值是一个集合类型
    	public List<Plan> getPlans(){
    		List<Plan> list=new ArrayList<Plan>();
    	
    		Plan p1=new Plan("2016年12月17日","计划一");
    		Plan p2=new Plan("2016年12月18日","计划二");
    		
    		list.add(p1);
    		list.add(p2);
    		return list;
    		
    	}
    	
    	//用来打印集合中提醒内容的方法
    	public void printMessage(){
    		List<Plan> list= getPlans();
    		for (Plan plan : list) {
    			System.out.println("计划的时间:"+plan.getDate()+"	"+"计划内容:"+plan.getTask());
    		}
    	}
    }
    

    步骤四:创建Quartz层,提醒业务类,实现Job接口,并植入Service对象

     

    步骤五:构建Job、Trigger,并绑定Job和Trigger

    	public static void tool() throws Exception{
    	      //构建Job
    	     JobDetail job = JobBuilder.newJob(RemindJob.class)
    				         .withIdentity("job1", "group1").build();
    		 
    	     //构建Trigger 
    	    Date runTime = DateBuilder.evenMinuteDate(new Date(System.currentTimeMillis()));
    	    Trigger trigger = TriggerBuilder.newTrigger()
    	    		.withIdentity("trigger1", "group1")
    	    		.startAt(runTime).build();
       
    	    //绑定Job和Trigger
    	    //创建调度者工厂
    	    SchedulerFactory sf = new StdSchedulerFactory();
    	    //创建一个调度者
    	    Scheduler sched = sf.getScheduler();
    	   //注册并进行调度
    	    sched.scheduleJob(job,trigger);
    	   //启动调度
    	    sched.start();
    	    
    	    /*Thread.sleep(3000);
    	    sched.shutdown();*/
    	}
        
        
    public static void main(String[] args) throws Exception {
    	tool();
    	System.out.println("你猜");
    }
    }
    

     


    每隔一段时间执行一次操作

     


    在特殊时间执行某次操作

     使用CronTrigger

    CronTrigger也是Trigger的子类

    CronTriggerSimpleTrigger的对比:

    CronTrigger允许用户更精准地控制任务的运行日期和时间,而不仅仅是定义工作的频度

    CronTrigger通过Cron表达式定义准确的运行时间点。创建CronTrigger的语法如下:

     


    四、Cron表达式

     要使用CronTrigger,必须掌握Cron表达式

     Cron表达式由6~7个由空格分隔的时间元素组成。第7个元素可选 

     

    Cron表达式有几个特殊的字符,说明如下:

    Cron表达式案例:

    示例:

  • 相关阅读:
    bzoj3884: 上帝与集合的正确用法(数论)
    洛谷10月月赛R2·浴谷八连测R3题解
    bzoj5055: 膜法师(BIT)
    bzoj2213: [Poi2011]Difference(思维题)
    bzoj1016: [JSOI2008]最小生成树计数(kruskal+dfs)
    一模 (2) day2
    一模 (2) day1
    Prime Palindromes
    常州培训 day5 解题报告
    一模 (1) day2
  • 原文地址:https://www.cnblogs.com/WJ-163/p/6194595.html
Copyright © 2020-2023  润新知