[Quartz]Quartz定时器的j2ee系统使用

Quartz是个优秀的开源定时器,可以用来实现j2ee系统中的很多定时操作。
这里只作简要的描述,官方网站上有详细的介绍
[url]http://www.opensymphony.com/quartz/[/url]

简单的来说,Quartz将一个定时事件分成两个模块:Job(任务)和Trigger(触发器)
Job用来定义工作内容;Trigger用来说明触发条件,也就是定时条件
一个Job可以跟多个的Trigger关联,从而实现不同类型的定时事件。
Trigger类有两个继承类SimpleTrigger和CronTrigger,具体的差别请查看文档

添加一个定时事件,实现每小时执行一次SayHelloWorld定义的任务

SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
JobDetail jobDetail = new JobDetail("jobName", "groupName",
SayHelloWorld.class);
// fire every house
Trigger trigger = TriggerUtils.makeHourlyTrigger();
// start on the next even hour
trigger.setStartTime(TriggerUtils.getEvenHourDate(new Date()));
trigger.setName("triggerName");
scheduler.scheduleJob(jobDetail, trigger);


public class SayHelloWorld implements Job {

public void execute(JobExecutionContext context)
throws JobExecutionException {
System.out.println("Hello World");

}
}


暂停某个Job的定时

scheduler.pauseJob("jobName","groupName");

恢复某个Job的定时

scheduler.resumeJob("jobName","groupName");

当然,可以暂停一个任务组(group)或者指定的一个触发(trigger),Schedule类提供相应的API实现

更改某个Job的定时时间

newTrigger.setJobName(jobDetail.getJobName()); // 对应的job名称
scheduler.rescheduleJob(newTrigger.getName(),
Scheduler.DEFAULT_GROUP,newTrigger);


通过上述的代码就可以实现基本的定时功能。

Quartz对定时事件的记录有两种方式:内存(RAMJobStore)和数据库(JDBCJobStore)

RAMJobStore方式:定时事件记录会因为各种终止系统的操作而消失,但是反应速度快
JDBCJobStore方式:可以保证定时事件记录的存储,反应速度稍慢于RAMJobStore方式(当然,不会影响正常的定时操作的时间准确性)

采用JDBCJobStore方式,需要在工程相应的数据库中建立满足Quartz要求的12张表,数据库表的创建脚本同Quartz的二进制包同时发布,在发布包的doc/目录下

如果采用Hibernate等ORM工具,同时希望对Quartz表数据进行控制,那就需要对12表进行相应的模型建立
下面以JDBCJobStore方式为例配置Quartz,该配置只满足最基本的Quartz配置要求
quartz.properties

## Configuration for JDBC-JobStoreTX
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.dataSource = myDS

## Configuration for DataSource
org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver
org.quartz.dataSource.myDS.URL = jdbc:mysql://localhost/money?autoReconnect=true
org.quartz.dataSource.myDS.user = xxx
org.quartz.dataSource.myDS.password = xxx

## Configuration for ThreadPool
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 10


以web容器方式启动Quartz,在web.xml文件中添加
<!-- Quartz -->
<servlet>
<display-name>Quartz Initialzer Servlet</display-name>
<servlet-name>QuartzInitializer</servlet-name>
<servlet-class>
org.quartz.ee.servlet.QuartzInitializerServlet
</servlet-class>
<init-param>
<param-name>config-file</param-name>
<param-value>quartz.properties</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

这里对config-file属性做一个说明,该变量的相对路径是classpath(/WEB-INF/classes)


附上个人定义的Quartz的Hibernate模型
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页