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 )并将它们全部添加到调度器中,从而在调度器中存储许多“实例定义”。

 

posted @ 2018-07-10 11:26  Goxcheer  阅读(128)  评论(0编辑  收藏  举报