由于客户需要尽快的看到项目原型,自己在两天内使用Quartz+Struts2,使用XML文件做持久化,搭建了一个Demo的项目工程。
功能的主要是希望能够通过界面化对Job进行CRUD操作之外,以及控制Job的启动、停止以及Job的删除操作,至于CRUD操作,主要就是通过对XML文件使用Dom4j进行解析,在有就是拼接等操作。对于Job的控制操作,需要了解下Quartz,把自己看过研究些的资料说下,在把遇到的问题说下。
JobDetail是用来包装Job实例的具体细节的。Job以class的方式传入JobDetail,quartz会自动实例化Job类的。同时需要规定job的name和group,在jobdetail的validate()下,一个job是必须有name和group属性,并且二者组合标示唯一的job。JobDetail中的一些重要数据存放在JobDataMap中,这个map可以用来在控制程序和job内传递需要传递的参数。
JobDetail还有三个重要的boolean值的属性,分别是durability、volatility、shouldRecover。这三个属性默认是false,主要在数据库操作的时候起作用。
Trigger时间调度
相对于job,trigger简单一些。所谓的时间调度,就是设置job执行的时间表。Trigger主要分为SimpleTrigger和CronTrigger两大类。前者主要是以1/1000
为单位的简单时间,可是设置startTime、endTime、repeatCount、repeatInterval等主要参数。CronTrigger的详细用法参看quartz文档的的CronTriggers Tutorial。
scheduler.schedulerJob(jobDetail, trigger);将JobDetail和对应的Trigger部署到scheduler中,然后根据trigger的定义,自动执行指定job。
Calendar这个类用来标识出特殊的时间,scheduler根据trigger执行job的时候,如果遇到这些标识出的特殊时间则不执行job。Calendar具体的接口有BaseCalendar、AnnualCalendar、HolidayCalendar、MonthlyCalendar、WeeklyCalendar等等。calendar的具体用法参看quartz的文档。
Misfire Instruction....设定当trigger错过了触发时刻的时候需要采取的处理策略
TriggerUtils相当于一个trigger factory,方便我们取得特殊trigger的实例,而不用自己去构造。
关于Quartz的多线程方面可以参考文章http://liuwei-git-com-cn.iteye.com/blog/332787
注意一点的是Quartz中的实例例如HelloWorld实例:
1. HelloJob 接口
public class HelloJob implements Job{
private static Log logger = LogFactory.getLog(HelloJob.class);
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
// TODO Auto-generated method stub
logger.info("Hello World ");
System.out.println("Hello World");
}
2 HelloScheduler类
public class HelloScheduler {
public void run() throws Exception{
Log logger=LogFactory.getLog(HelloScheduler.class);
logger.info("Hello Schduler init***");
System.out.println("Hello Schduler init***");
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler sched = sf.getScheduler();
if(sched.isShutdown()){
System.out.println("调度已经停止**");
sched.start();
}
logger.info("Hello Schduler init end ***");
System.out.println("Hello Schduler init end ***");
// computer a time that is on the next round minute
Date runTime = TriggerUtils.getEvenMinuteDate(new Date());
// define the job and tie it to our HelloJob class
JobDetail helloJob = new JobDetail("helloJob", "helloGroup", HelloJob.class);
// Trigger the job to run on the next round minute
SimpleTrigger trigger =
new SimpleTrigger("helloTrigger", "helloGroup", runTime);
sched.scheduleJob(helloJob, trigger); //对应触发器触发的Job
System.out.println(helloJob.getFullName() + " will run at: " + runTime);
logger.info(helloJob.getFullName() + " will run at: " + runTime);
// Start up the scheduler (nothing can actually run until the
// scheduler has been started)
sched.start();
logger.info("------- Started Scheduler -----------------");
// wait long enough so that the scheduler as an opportunity to
// run the job!
logger.info("------- Waiting 90 seconds... -------------");
try {
// wait 90 seconds to show jobs
Thread.sleep(90L * 1000L);
// executing...
} catch (Exception e) {
}
// shut down the scheduler
logger.info("------- Shutting Down ---------------------");
//sched.shutdown(true);
logger.info("------- Shutdown Complete -----------------");
}
public static void main(String[] args) throws Exception {
HelloScheduler helloExample = new HelloScheduler();
helloExample.run();
}
}
这个运行没问题,但是如果通过在Web项目中,通过使用getScheduler()方法获取Schedule对象,会抛出异常,所以需要通过工厂在调用之前创建几个Schedule即可。
DirectSchedulerFactory factory=DirectSchedulerFactory.getInstance();
factory.createVolatileScheduler(10);
Scheduler sche=factory.getScheduler();
我在做Web项目时,按照给的实例直接获得造成了异常,这样解决就可以了
分享到:
相关推荐
在使用Quartz集群功能时,可能会遇到这样的警告:“这个调度器实例(实例名)仍然活跃,但是已经被集群中的另一个实例恢复。”这种警告可能表明集群中的实例之间存在时间同步问题。 **解决方案**: - **检查时钟同步...
总结起来,Quartz和IIS结合使用时,可能会遇到IIS闲置时间导致任务中断的问题。通过调整IIS设置、优化Quartz配置,甚至将任务调度服务迁移出IIS,我们可以确保定时任务的稳定运行。在实际应用中,应根据具体需求和...
在“quartz 调用两次任务”这个问题中,我们可能遇到了一个常见问题,即同一个 Quartz 任务被错误地触发执行了两次。 在 Quartz 中,任务(Job)是通过实现 `org.quartz.Job` 接口的类来创建的,而调度则是通过 `...
Quartz是一个完全由Java编写的开源作业调度框架,适用于多种Java应用程序环境,包括但不限于J2SE、Web应用以及J2EE应用服务器。它提供了一种简单而灵活的方式来定义、调度和管理各种定时任务。 #### 二、Quartz的...
总结来说,Quartz 提供了一个强大且灵活的定时任务调度解决方案,它允许你动态地管理任务和调度。通过配置数据库持久化,你可以方便地查看和修改任务设置。虽然在特定的 cron 表达式问题上遇到了挑战,但通常 Quartz...
总结来说,"Quartz+spring定时任务demo" 提供了一个集成 Quartz 与 Spring 的实例,帮助开发者快速理解和使用这种组合来创建和管理定时任务。这不仅简化了任务的编写,还充分利用了 Spring 的优点,提高了代码的可...
Quartz是一个开源的作业调度框架,用于开发Java应用程序。它提供了强大的触发器(Trigger)机制用于关联作业(Job),同时还具备灵活的表达式用于配置定时任务。Quartz能够集成到任何Java应用中,无论是独立的或已...
Quartz 2D是苹果公司为MacOS开发的一个高性能、功能丰富的2D图形处理框架。它不仅适用于MacOS平台,也被广泛应用于iOS设备上。Quartz 2D提供了一系列强大的API,支持高级图像处理任务,如路径绘制、图像渲染、PDF...
总结起来,Quartz是一个强大的定时任务框架,广泛应用于Java开发中。通过源码学习,开发者可以深入理解其内部机制,并根据需求进行定制。结合像EfficientPIM这样的工具,Quartz可以实现在日常生活中或企业环境中的...
- **Quartz 是什么**:Quartz 是一个任务日程管理系统,用于调度和管理定时任务。 - **为什么不使用 java.util.Timer**:相比于 `java.util.Timer`,Quartz 提供了更强大的调度功能、集群支持以及事务处理能力。 ...
Quartz和Spring整合是企业级应用中常见的任务调度解决方案,Quartz是一个开源的作业调度框架,而Spring则是Java领域广泛使用的轻量级框架。这两者的整合使得开发者可以在Spring管理的bean中灵活地定义和执行定时任务...
Quartz 是一个功能强大的开源作业调度框架,它可以定义定时任务并管理这些任务的触发逻辑。该框架支持复杂的循环规则,并且可以集成到任何 Java 应用程序中,无论是独立运行还是部署在应用服务器中。 #### 二、搭建...
- **作用**:由于Quartz在每次执行任务时都会重新创建一个 `Job` 实例,因此它不能直接接收一个 `Job` 的实例,而是需要一个类来描述 `Job` 的实现类及其相关静态信息,如任务的名字、描述、关联的监听器等。...
总结来说,Quartz是一个强大的定时任务框架,通过定义作业和触发器,我们可以方便地在Java Web应用中实现各种定时任务的调度。在使用过程中,需要理解并合理配置调度器、作业和触发器,同时注意任务的生命周期管理和...
Quartz是一个开源的作业调度框架,它允许程序在预定的时间执行任务。在Quartz中,Cron表达式是一种强大的工具,用于定义作业的触发时间。本文将深入探讨Quartz Cron表达式的实例及其源码解析。 一、Cron表达式基础 ...
Quartz.Net是一个功能丰富的开源任务调度框架,适用于多种.NET环境,包括.NET Core。本文将深入探讨如何在.NET Core 2.2及以上版本中利用Quartz进行高级任务调度。 一、Quartz.Net简介 Quartz.Net提供了强大的定时...
3. **Hibernate 4.1.0**:Hibernate是一个ORM(对象关系映射)框架,它允许开发者以面向对象的方式操作数据库。在集成Spring时,可以使用Spring的HibernateTemplate或SessionFactory来管理会话和事务。 4. **二级...
1. **Quartz的基本认知**:Quartz是一个开源的作业调度框架,它允许应用程序定义复杂的调度任务,如定时执行某些操作。HAP框架可能集成Quartz作为其定时调度的基础。 2. **Quartz Job接口概述**:Quartz Job接口是...
每个字段可以包含一个具体的值、一个范围、一个列表、一个通配符(*)或一个步长值(如*/5表示每5单位时间执行一次)。例如,“0 0 12 * * ?”表示每天的12点整执行。 在Java Swing环境中,创建一个用户界面来解析...