`
suichangkele
  • 浏览: 198162 次
  • 性别: 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-all-1.6.0.jar包定时任务jar

    3. **Scheduler**: Scheduler是整个Quartz框架的中心,它负责管理所有的Job和Trigger,以及它们之间的关联。通过调用Scheduler的start()方法启动调度服务,然后使用`scheduleJob(JobDetail, Trigger)`方法将Job和...

    quartz-2.3.0-distribution.zip

    "quartz-2.3.0-distribution.zip"这个压缩包包含了Quartz库的2.3.0版本及相关资源,对于开发者来说是学习和使用Quartz的重要资料。 1. **Quartz的核心概念** - **Job**:Quartz中的工作单元,代表一个需要执行的...

    quartz-all-1.6.0.jar

    2. **可持久化**:Quartz 支持将任务和触发器存储在数据库中,即使应用程序重启,也能恢复之前的状态,保证任务的连续性。 3. **集群支持**:Quartz 可以在多台服务器组成的集群中运行,当一台服务器故障时,任务...

    quartz-2.2.2-distribution.rar

    综上所述,这个压缩包提供的 Quartz 2.2.2 版本和 Spring Boot 2.x 的集成示例,对于学习和使用 Quartz 进行任务调度具有很高的参考价值。无论是初学者还是经验丰富的开发者,都可以从中受益,快速掌握如何在 Spring...

    quartz和spring-quartz

    通过JobDetail来配置Job的属性,如Job的名称、组别、数据绑定等。 2. **Trigger**: 触发器决定了Job的执行时间。Quartz提供了多种Trigger类型,如SimpleTrigger(简单触发器)用于一次性或间隔执行,CronTrigger...

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

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

    quartzall1.6.0jar_quartz-all-1.6.0.jar_

    4. **插件支持**:Quartz提供了多种插件,如JobStore插件用于存储Job和Trigger,ThreadPool插件用于管理执行任务的线程池,以及Scheduler插件用于控制调度行为。 5. **灵活的调度**:Quartz允许你使用Cron表达式或...

    quartz-2.3.0-distribution.tar.gz

    4. **JobDetail(作业详情)**:封装了 Job 类的信息,包括 Job 类的类名、关联的数据以及 Job 是否持久化等设置。 5. **Calendar(日历)**:Quartz 支持结合 Trigger 使用自定义的日历,以便在特定日期或时间段内...

    quartz-2.2.3-distribution.zip

    下面我们将深入探讨Quartz的核心特性、功能、使用场景以及如何进行配置。 1. **Quartz核心特性**: - **可移植性**:Quartz设计为完全跨平台,可以在任何支持Java的环境中运行。 - **灵活的调度**:它支持简单与...

    spring-context-support.jar,quartz-all-1.6.0.jar

    `quartz-all-1.6.0.jar`包含了Quartz的所有功能模块,包括核心API、JDBC作业存储支持以及一些其他的实用工具。 集成Quartz到Spring项目中,首先需要在Spring的配置文件中定义一个`SchedulerFactoryBean`,这将负责...

    Multiple-Jobs-in-Quartz-Spring-Example

    JobDetail 包含了 Job 的类信息以及相关的数据绑定。我们可以使用 Spring 的 `JobDetailFactoryBean` 来简化这一过程。 ```java @Bean public JobDetail myFirstJobDetail() { return JobBuilder.newJob...

    quartz-2.2 需要的jar以及src源代码

    这个压缩包“quartz-2.2.3”包含了Quartz库的jar文件以及源代码,这对于开发者理解和自定义Quartz的工作流程非常有帮助。 1. **Quartz简介** - Quartz是一个轻量级的作业调度框架,完全用Java编写,可以嵌入到任何...

    quartz-2.2.3-官方文档数据及PDM表结构.zip

    2. **调度器(Scheduler)**:调度器是Quartz的核心组件,它负责管理所有的Job和Trigger,以及它们的执行计划。通过Scheduler实例,你可以注册Job和Trigger,启动、暂停、恢复或删除它们。 3. **持久化...

    quartz-2.1.7.gz

    4. **调度Job**:将Job和Trigger关联,添加到Scheduler中,通过`scheduler.scheduleJob(jobDetail, trigger)`进行调度。 5. **启动Scheduler**:调用`scheduler.start()`启动调度服务,让Quartz开始监控并执行任务...

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

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

    quartz-1.6.0任务调试

    在"quartz-1.6.0任务调试"中,我们需要理解Quartz的基本概念、配置以及如何进行任务的调试。 首先,Quartz的核心是Job和Trigger。Job是实际需要执行的任务,而Trigger则是触发Job执行的时间规则。在Quartz 1.6.0...

    quartz-2.4.0.zip

    1. **API文档**:Quartz提供了详尽的Javadoc,帮助开发者了解如何创建、配置和管理Job以及Trigger。 2. **源代码**:对于学习和调试非常有用,可以深入理解其内部机制。 3. **示例**:通常会有一系列的示例项目,...

    quartz-2.2 以及关联jar包

    4. **API简化**:Quartz-2.2对API进行了优化,使其更加简洁易用,降低了学习曲线。 5. **插件增强**:增加了更多内置插件,如JobListener、TriggerListener等,便于监控和调试。 三、Quartz配置与集成 1. **配置...

    Spring Quartz定时器的jar包

    2. 配置Spring的ApplicationContext,声明Quartz相关的bean,如SchedulerFactoryBean、JobDetail和Trigger。 3. 定义Job类,实现`org.quartz.Job`接口,定义任务的具体逻辑。 4. 创建Trigger,指定Job的执行策略,...

    quartz-2.1.7 官方jar包源码

    2. `org.quartz.impl` 包:包含对Scheduler的工厂方法以及各种实用工具类,如DefaultSchedulerFactory用于创建Scheduler实例。 3. `org.quartz.triggers` 包:提供了多种Trigger类型的实现,如CronTrigger、...

Global site tag (gtag.js) - Google Analytics