zoukankan      html  css  js  c++  java
  • Jobs深入学习

    代码回顾

        Quartz 需要了解你可能希望该作业的实例拥有的各种属性,这是通过JobDetail 类完成的。

         JobDetail 实例是使用 JobBuilder 类构建的。   

            JobDetail job = JobBuilder.newJob(MyJob.class)
                    .withIdentity("job1", "group1")
                    .build();
    
            // Trigger the job to run now, and then repeat every 5 seconds
            Trigger trigger = TriggerBuilder.newTrigger()
                    .withIdentity("trigger1", "group1")
                    .startNow()
                    .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                            .withIntervalInSeconds(5)
                            .repeatForever())
                    .build();
    
            // Grab the Scheduler instance from the Factory
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
            // and start it off
            scheduler.start();
            // Tell quartz to schedule the job using our trigger
            scheduler.scheduleJob(job, trigger);

    JobDetail的生命周期

        1.我们给调度程序提供了一个 JobDetail 实例,并且它知道在构建 JobDetail 时只需提供作业的类就可以执行的工作类型。

          2.调度程序执行任务时,每个(以及每个)时间都在调用它的 execute(..) 方法之前创建一个类的新实例。 
        3.当执行完成时,对作业类实例的引用被删除,然后实例被垃圾收集。 


    JobDataMap

         这种行为的一个分支是,作业必须有一个无参数的构造函数(当使用默认的JobFactory实现时)。 
         另一个分支是,在作业类上定义状态数据字段是没有意义的,因为它们的值不会在作业执行之间保留。

          若需要传数据,则可以使用JobDataMap

          JobDataMap 可以用来保存任何数量(可序列化)的数据对象,您希望在它执行时将它们提供给作业实例。 
                     JobDataMap 是 Java Map 接口的一个实现,它提供了一些用于存储和检索原始类型数据的便利方法。

      代码实现:

       这里有一些快速的片段,可以将数据输入 JobDataMap,同时定义/构建 JobDetail,然后将作业添加到调度器:

    JobDetail job = JobBuilder.newJob(HelloJob.class)
                    .withIdentity("job1", "group1")
                    .usingJobData("user", "goxcheer")
                    .usingJobData("words", "Hello Quartz")
                    .build();

       执行时我们可以将这些数据拿到,方式如下:

        

        public HelloJob() {
            super();
        }
    
        public void execute(JobExecutionContext context) throws JobExecutionException {
            JobKey key = context.getJobDetail().getKey();
            JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
            String str1 =jobDataMap.getString("user");
            String str2 = jobDataMap.getString("words");
            System.out.println("Instance:"+key+ " user:"+str1+" words:"+str2);
        }

    MergedJobDataMap

        如果你添加 setter 方法工作类,对应键的名字 JobDataMap(如setJobSays数据(字符串val)方法在上面的示例中),然后 Quartz 默认 JobFactory 实现将自动调用这些 setter 当工作被实例化,从而防止需要显式地获得值的 map 在你的执行方法。

        对应的不同代码:

    public class HelloJob implements Job{
    	
    	private String user;
    	private String words;
    	
    	public HelloJob() {
    		super();
    	}
    
    	public void execute(JobExecutionContext context) throws JobExecutionException {
    		JobKey key = context.getJobDetail().getKey();
    		context.getMergedJobDataMap();  //此处不同
    		System.out.println("Instance:"+key+ " user:"+user+" words:"+words);
    	}
    
    	public String getUser() {
    		return user;
    	}
    
    	public void setUser(String user) {
    		this.user = user;
    	}
    
    	public String getWords() {
    		return words;
    	}
    
    	public void setWords(String words) {
    		this.words = words;
    	}	
    }
    

     JobInstance

       您可以创建一个作业类,并通过创建多个 JobDetails 实例(每个实例都有自己的属性和 JobDataMap )并将它们全部添加到调度器中,从而在调度器中存储许多“实例定义”。

  • 相关阅读:
    Java集合:HashMap
    Java线程池原理
    Linux常用命令
    分布式系统基本概念
    接口中的default方法(默认方法)
    正则表达式匹配+过滤
    Java Optional类
    mongo过期索引
    Java8函数式接口简介
    JS版微信6.0分享接口用法分析
  • 原文地址:https://www.cnblogs.com/goxcheer/p/9288075.html
Copyright © 2011-2022 走看看