`
suichangkele
  • 浏览: 192734 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

quartz学习02-job 以及jobDetail(2)

阅读更多

继续讨论job和jobDetail的知识。

 

1、能不能将同一个jobDetail或者是Trigger重复添加到同一个scheduler中,这个问题是我在学习quartz时突发奇想思考到的。所有的jobDetail和Trigger都被存储起来了,quartz中含有一个接口:JobStore,他的javadoc这么写:存储Job和Trigger供QuartzScheduler调用。我debug发现使用的实现类是RAMJobStore,它里面的storeJob(JobDetail, boolean)方法中定义了对添加JobDetail的描述:如果boolean变量是true,则会覆盖原先已经有的jobDetail,如果是false则会抛异常,jobDetail重复的标准是JobKey的相同,也就是调用equals的结果相同。在源码中是将存储的jobdetail按照jobKey和group进行了分组,存储到hashMap中。

 

2、一个scheduler中只能添加一个jobDetail吗,或者是能不能在一个scheduler中通过添加多个trigger但是只添加一个JobDetail?在我看来是否定的,最起码在使用RamJobStore时是这样,而这个store是官网推荐的store。在这个类中添加JobDetail时,会调用这个方法:

 

public void storeJobAndTrigger(JobDetail newJob,
            OperableTrigger newTrigger) throws JobPersistenceException {
        storeJob(newJob, false);
        storeTrigger(newTrigger, false);
}
public void storeJob(JobDetail newJob,boolean replaceExisting) throws ObjectAlreadyExistsException {
        JobWrapper jw = new JobWrapper((JobDetail)newJob.clone());
        boolean repl = false;
        synchronized (lock) {
            if (jobsByKey.get(jw.key) != null) {//我加的注释,如果已经有这个jobKey,并且replaceExisting为false,就比报错,而且上面调用传入的就是false。
//也就是不支持多个相同的jobdetail
                if (!replaceExisting) {
                    throw new ObjectAlreadyExistsException(newJob);
                }
                repl = true;
            }
            if (!repl) {
                // get job group
                HashMap<JobKey, JobWrapper> grpMap = jobsByGroup.get(newJob.getKey().getGroup());
                if (grpMap == null) {
                    grpMap = new HashMap<JobKey, JobWrapper>(100);
                    jobsByGroup.put(newJob.getKey().getGroup(), grpMap);
                }
                // add to jobs by group
                grpMap.put(newJob.getKey(), jw);
                // add to jobs by FQN map
                jobsByKey.put(jw.key, jw);
            } else {
                // update job detail
                JobWrapper orig = jobsByKey.get(jw.key);
                orig.jobDetail = jw.jobDetail; // already cloned
            }
        }
    }

 

 

3、Trigger是如何知道要调用哪个JobDetail呢?  Trigger里面含有JobKey,通过这个在RamJobStore中的按照JobKey分组的hashMap中查找的。

 

4、能不能改变已经提交到Scheduler的jobDetail,是可以的。Scheduler中提供了接口:Scheduler.deleteJob(new JobKey("myJob", Scheduler.DEFAULT_GROUP));这样就可以把已经提交的jobDetail还有跟他一起提交的所有Trigger都删除(一个JobDetail可以有多个Trigger),源码中是在RamJobStore中的removeJob方法中提及的。

 

5、文档中还提及了再jobDetail已经不会再被调度的情况下,Scheduler对jobDetail的处理,默认是将其删除,也就是如果一个JobDetail已经不会再被调度,那么就会从scheduler中将其删除。我们可以做个实验:

package demo;

import static org.quartz.JobBuilder.newJob;
import static org.quartz.TriggerBuilder.newTrigger;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.impl.StdScheduler;
import org.quartz.impl.StdSchedulerFactory;

import job.HelloJob;

public class Demo1 {

	public static void main(String[] args) throws InterruptedException {

		try {
			StdSchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory();
			StdScheduler sched = (StdScheduler) schedFact.getScheduler();
 			//开始调度器
			sched.start();
			//创建job任务
			JobDetail job = newJob(HelloJob.class).withIdentity("myJob", Scheduler.DEFAULT_GROUP).build();
			
			//创建trigger,触发器
			Trigger trigger = newTrigger().withIdentity("myTrigger",Scheduler.DEFAULT_GROUP).startNow()
					          .withSchedule(SimpleScheduleBuilder.repeatSecondlyForTotalCount(2,3)).build();//每隔三秒执行一次,一共执行2次
			//将任务和触发器绑定到调度器
			sched.scheduleJob(job, trigger);
			 
			JobDetail j1 = sched.getJobDetail(new JobKey("myJob", Scheduler.DEFAULT_GROUP));
			System.out.println("之前:" + (j1 == null));
  			Thread.sleep(10000);//休息10秒,等待调度执行完成,调度一共只有不到4秒的时间就会完成,因为第一次马上就执行。
 			j1 = sched.getJobDetail(new JobKey("myJob", Scheduler.DEFAULT_GROUP));
			System.out.println("之后:" +(j1 == null));
 			Thread.sleep(1000000);
			sched.shutdown();
			
		} catch (SchedulerException se) {
			se.printStackTrace();
		}
	}
}

在HelloJob中的execute方法中只是输出一句话  xxxx.

实验结果如下:

之前:false
xxxx
xxxx
之后:true

结果证明会将其删除,文档中提及可以将这个jobDetail注册为持久化的,通过将这个代码改为如下:

//创建job任务
JobDetail job = newJob(HelloJob.class).withIdentity("myJob", Scheduler.DEFAULT_GROUP).storeDurably(true).build();

 添加了storeDurable(true),这样再运行代码,就会发现,都是false了。

之前:false
xxxx
xxxx
之后:false

 

 

6、文档中还提及了requestRecovery的概念,但是我没有看懂,如果有人看懂了,可以给我留言,或者是加我qq:1902442871。 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    Quartz-Job-Scheduling-Framework-中文版-V0.9.1.zip

    还介绍了 Job、JobExecutionContext、JobDetail、JobDataMap,及如何访问 JobDataMap 中的数据。有状态和无状态的 Job。 第四章. 部署 Job (第三部分) 内容提要:Job 的易失性、持久性和可恢复性,如何从 Scheduler...

    Quartz2.2.1深入Job、JobDetail、JobDataMap、Trigger

    Quartz2.2.1深入Job、JobDetail、JobDataMap、Trigger ,具体效果和过程看博文:http://blog.csdn.net/evankaka/article/details/45361759

    Quartz之Job与JobDetail深入解析

    下面小编就为大家带来一篇Quartz之Job与JobDetail深入解析。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    Spring3.2.4+Quartz2.2.0 Demo

    -- quartz-2.x的配置 --&gt; class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"&gt; &lt;property name="jobDetail"&gt; &lt;value&gt;0/1 * * * * ? &lt;!-- 调度的配置结束 --&gt; &lt;!-- ...

    quartz声明事j2EE实现

    quartz quartz-1.5.2.jar quartz.properties quartz_job.xml 实现在J2ee下quartz声明事CornTrigger,jobDetail的配置文件和类

    quartz的基本使用,配置job,jobdetail,trigger,Scheduler

    通过CronScheduleBuilder、SimpleScheduleBuilder设置时间规则。

    quartz 定时任务

    &lt;property name="jobDetail" ref="helloJob" /&gt; &lt;!-- 3秒后第一次执行 --&gt; &lt;!-- 5秒后重复执行 --&gt; &lt;!-- scheduler --&gt; &lt;bean class="org.springframework.scheduling.quartz....

    spring定时器轻松搞定

    &lt;property name="jobDetail" ref="MapOutTime"&gt;&lt;/property&gt; &lt;property name="cronExpression"&gt; &lt;value&gt;0 1,16,31,46 * * * ?&lt;/value&gt; &lt;!--每天每时的1,16,31,46触发一次--&gt; &lt;/property&gt; &lt;/bean&gt; &lt;!-...

    QuartzManager

    JobDetail jobDetail = JobBuilder.newJob(jobClass) .withIdentity(jobName, jobGroupName).build(); JobData jobData = new JobData(); jobData.setJobId(jobName); jobData.setJobName(jobName); jobDetail...

    Quartz 框架快速入门

    Spring通过JobDetailBean,MethodInvokingJobDetailFactoryBean实现Job的定义。后者更加实用,只需指定要运行的类,和该类中要运行的方法即可,Spring将自动生成符合Quartz要求的JobDetail。

    QuartzDemo:Spring Boot + Quartz 搭建的一个拥有展示界面的任务调度系统 Demo

    JobDetail :Job的描述类,job执行时的依据此对象的信息反射实例化出Job的具体执行对象。 Trigger:触发器,存放Job执行的时间策略。用于定义任务调度时间规则。 JobStore: 存储作业和调度期间的状态 Calendar:...

    基于spring boot任务管理系统源代码.zip

    在resources/application.properties 以及quartz.properties文件中替换为自己的数据源。 运行Application main方法启动项目,项目启动会自动创建一个测试任务 见:com.itstyle.quartz.config.TaskRunner.java。 项目...

    quartz 包,源文件与 使用说明

    JobDetail类:具体某个定时程序的详细描述,包括Name,Group,JobDataMap等。 JobExecutionContext类:定时程序执行的run-time的上下文环境,用于得到当前执行的Job的名字,配置的参数等。 JobDataMap类:用于描述一个...

    spring定时任务

    spring定时任务 &lt;?xml version="1.0" encoding="UTF-8"?...&lt;property name="jobClass"&gt; &lt;value&gt;com.test.Test&lt;/value&gt; &lt;!-- 关键在如下两个触发器的配置 --&gt; &lt;!-- 类似于Java的简单触发器 --&gt; ...

    MethodInvokingJobDetailFactoryBean.java

    -- 定时任务 方式2(集群方式)--&gt; &lt;bean id="timerJob" class="job.TimerJob"&gt; class="frameworkx.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"&gt; ...

Global site tag (gtag.js) - Google Analytics