一、在普通项目中增加定时调度引擎Quartz

前言


定时调度应该是每个项目必不可少的功能,像商城系统的报表的生成、商城和商户的对账,又或者是财务系统的定时同步数据,定时短信提醒等功能,应用十分广泛。我在这里主要讲目前应用最广泛的Quartz来做定时调度引擎.

Quartz介绍


Quartz是一个完全由java编写的开源作业调度框架,由OpenSymphony开源组织创立于1998年。
下面是他的官网,大家可以去下载最新的Quartz
http://www.quartz-scheduler.org
Quartz框架的核心是调度器。定时任务以作业的概念进行存储。调度器通过触发器来调用作业。

具体的概念这里不讲了,直接步入正题,先从当前项目整合Quartz开始,我来教大家如何在自己的项目中加入Quartz定时调度引擎
后续中会给大家讲一下Quartz如何做集群,以及定时调度如何单独部署作为组件服务。

Spring整合Quartz的RAM方式

什么是Quartz的RAM方式?看下面解释...
quartz最基本的概念就是job,在job内调用具体service完成具体功能,quartz需要把每个job存储起来,方便调度,quartz存储job方式就分三种,我们最常用的也是quartz默认的是RAMJobStore,RAMJobStore顾名思义就是把job的相关信息存储在内存里,如果用spring配置quartz的job信息的话,所有信息是配置在xml里,当spirng context启动的时候就把xml里的job信息装入内存。这一性质就决定了一旦JVM挂掉或者容器挂掉,内存中的job信息就随之消失,无法持久化,优点就是配置简单,我们先来学习这种最简单常用的方式。

我们使用一个ssh的简单demo来集成Quartz,模拟我们实际工作中从无到有加入定时调度,项目结构如下

1.        在项目中加入Quartz相关jar包

Spring.jar

quartz-all-1.8.6.jar

quartz-oracle-1.8.6.jar(如果是Oracle请加入这个jar包)

quartz-weblogic-1.8.6.jar(如果中间件使用的weblogic请加入这个jar包)

slf4j-api-1.5.6.jar

slf4j-log4j12-1.5.6.jar

2.        增加spring-time.xml配置文件

内容如下

<?xmlversion="1.0"encoding="UTF-8"?>

<!DOCTYPEbeansPUBLIC"-//SPRING//DTD BEAN//EN"

        "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

 

     <!-- 调度器lazy-init='false'那么容器启动就会执行调度程序 -->

     <beanid="startQuertz"lazy-init="false"autowire="no"class="org.springframework.scheduling.quartz.SchedulerFactoryBean">

         <propertyname="triggers">

              <list>

                   <refbean="doTime"/>

              </list>

         </property>

         <!-- 允许在Quartz上下文中使用Spring实例工厂 -->

         <propertyname="applicationContextSchedulerContextKey"value="applicationContext"/>

     </bean>

    

     <!-- 触发器 -->

     <beanid="doTime"class="org.springframework.scheduling.quartz.CronTriggerBean">

         <propertyname="jobDetail"ref="jobtask"></property>

         <!-- cron表达式 -->

         <propertyname="cronExpression"value="10,15,20,25,30,35,40,45,50,55 * * * * ?"></property>

     </bean>

    

     <!-- 任务 -->

     <beanid="jobtask"class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">

         <propertyname="targetObject"ref="synUsersJob"></property>

         <propertyname="targetMethod"value="execute"></property>

     </bean>

    

     <!-- 要调用的工作类 -->

     <beanid="synUsersJob"class="org.leopard.core.quartz.job.SynUsersJob"></bean>

      

</beans>   

 

Quartz的核心就是这个xml的配置

任务:jobtask定义了我们需要执行的定时任务类以及要执行的方法

触发器:doTime定义了任务需要什么时候执行(一个触发器关联一个job)

调度器:startQuertz负责加载任务和触发器

3.        在web.xml中增加我们刚刚加入的spring-time.xml文件

<context-param>

        <param-name>contextConfigLocation</param-name>

        <param-value>

            classpath:config/datasource.xml,

            classpath:config/spring/spring-common.xml,

            classpath:config/spring/spring-dao.xml,

            classpath:config/spring/spring-service.xml,

            classpath:config/spring/spring-time.xml

        </param-value>

    </context-param>

4.        增加我们需要执行的定时任务bean,内容如下

package org.leopard.core.quartz.job;

 

/**

 * 同步用户定时任务

 * @author Administrator

 *

 */

public class SynUsersJob {

   

    public void execute() {

       System.out.println("定时任务执行");

    }

 

}

 

ok,配置完成我们启动项目,看到如下输入内容证明我们的项目加入定时任务成功了



项目加入Quartz的RAM方式配置是最简单的,只需要这几步,我们就给我们的项目增加了定时调度的功能。

接下来会给大家讲一下Quartz的DataBase方式和Quartz的集群...

注意问题

问题一:spring核心包版本问题,替换下spring.jar为官方最新的就可以了

14:46:20,003 ERROR JobRunShell:232 - Job DEFAULT.jobtask threw an unhandled Exception:

java.lang.NoClassDefFoundError: org/springframework/beans/PropertyAccessorFactory

         at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:77)

         at org.quartz.core.JobRunShell.run(JobRunShell.java:223)

         at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:549)

        

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值