spring配置quartz定时任务

Spring3.0

一.Spring Bean 注入作业调度的两种方式

             方式一:@1、Spring使用JobDetailBean类,继承QuartzJobBean,重写
                            protected void executeInternal(JobExecutionContext context)方法

                           @2、  或实现Job接口,在execute方法中调用执行任务

                                                               
            方式二:Spring使用MethodInvokingJobDetailFactoryBean,普通Java类都可

注:方式一保存在数据库中,方式二在内存中处理。 

方式一实现:

   quartz.properties配置文件:

#==============================================================    

#Configure Main Scheduler Properties    

#==============================================================     

org.quartz.scheduler.instanceName =myQuartz  #唯一标示

org.quartz.scheduler.instanceId = AUTO  

  

#==============================================================    

#Configure JobStore   QRTZ_ quartz表的前缀 

#==============================================================   

org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX  

org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate  

org.quartz.jobStore.tablePrefix = QRTZ_  

#

org.quartz.jobStore.isClustered =true

org.quartz.jobStore.clusterCheckinInterval = 20000    

org.quartz.jobStore.dataSource = myDS  

 

org.quartz.jobStore.useProperties=true 

#==============================================================    

#Configure DataSource  数据库配置信息

#==============================================================   

 

org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver  

org.quartz.dataSource.myDS.URL = jdbc:mysql://192.168.0.50:3306/acdb

org.quartz.dataSource.myDS.user = ac

org.quartz.dataSource.myDS.password =ac

 

 

 

#org.quartz.dataSource.myDS.driver = oracle.jdbc.driver.OracleDriver  

#org.quartz.dataSource.myDS.URL = jdbc:oracle:thin:@127.0.0.1:1521:orcl 

#org.quartz.dataSource.myDS.user = hf  

#org.quartz.dataSource.myDS.password = hf  

 

org.quartz.dataSource.myDS.maxConnections = 30  

 

 

#==============================================================    

#Configure ThreadPool    

#==============================================================   

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool  

org.quartz.threadPool.threadCount = 10  

org.quartz.threadPool.threadPriority = 5  

org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true

 

applicationContext.xml 配置文件:

 

 

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"

xmlns:tx="http://www.springframework.org/schema/tx"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd

">

<!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序 -->

<bean id="acWarehouseSchedulerFactoryBean" lazy-init="false"

autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">

<property name="triggers">

<list>

<ref bean="deleteZipTrigger" />

</list>

</property>

<property name="applicationContextSchedulerContextKey" value="applicationContext" />

<property name="configLocation" value="classpath:quartz.properties" />

</bean>

 

 

<!-- 定义调用对象和调用对象的方法 -->

<bean id="deleteZipJobDetail" class="org.springframework.scheduling.quartz.JobDetailBean">

<property name="jobClass">

<value>com.xlwzsoft.acWarehouse.quartz.UpdateFromACDBClusterQuartzJobBean

</value>

</property>

<property name="jobDataAsMap">

<map>

<entry key="targetObject" value="deleteZipJob" />

<entry key="targetMethod" value="execute" />

</map>

</property>

</bean>

 

 

<!-- every hour -->

<!-- 定义触发时间 -->

<bean id="deleteZipTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">

<property name="jobDetail">

<ref bean="deleteZipJobDetail" />

</property>

<property name="cronExpression">

<value>59 59 * * * ?</value>

<!-- <value>0 0/3 * * * ?</value> -->

</property>

</bean>

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

<bean id="deleteZipJob" class="com.xlwzsoft.acWarehouse.quartz.TaskTestBean">

 

</bean>

 

</beans>

 

com.xlwzsoft.acWarehouse.quartz.UpdateFromACDBClusterQuartzJobBean类文件:

//@1步骤

public class UpdateFromACDBClusterQuartzJobBean extends QuartzJobBean {  

    protected final Log logger = LogFactory.getLog(getClass());  

    private String targetObject;  

    private String targetMethod;  

    private ApplicationContext ctx;  

  

    @Override  

    protected void executeInternal(JobExecutionContext context)  

            throws JobExecutionException {  

        try {  

       

            System.out.println("ac ---execute [" + targetObject + "] at once1111111111111>>>>>>");  

            Object otargetObject = ctx.getBean(targetObject);  

            Method m = null;  

  

            try {  

                m = otargetObject.getClass().getMethod(targetMethod, new Class[] {JobExecutionContext.class});  

                m.invoke(otargetObject, new Object[] {context});  

            } catch (SecurityException e) {  

                logger.error(e);  

            } catch (NoSuchMethodException e) {  

                logger.error(e);  

            }  

        } catch (Exception e) {  

            throw new JobExecutionException(e);  

        }  

    }  

  

    public void setApplicationContext(ApplicationContext applicationContext) {  

        this.ctx = applicationContext;  

    }  

  

    public void setTargetObject(String targetObject) {  

        this.targetObject = targetObject;  

    }  

  

    public void setTargetMethod(String targetMethod) {  

        this.targetMethod = targetMethod;  

    }  

}

TaskTestBean类文件:

//@2步骤

public class TaskTestBean implements Job ,Serializable { 

private static final long serialVersionUID = 4937479059845599009L;

    private static final Logger logger = Logger.getLogger(TaskTestBean.class);

    public TaskTestBean(){

   

    }

      

    @Override  

    public void execute(JobExecutionContext arg0) throws JobExecutionException {  

    logger.info("-----------进入自动任务------------");

   

        logger.info("-----------此次自动任务结束------------");

   

    }

 }

 

方式二:

 

applicationContext.xml 配置文件:

 

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"

xmlns:tx="http://www.springframework.org/schema/tx"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd

">

 

<!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序 内存中处理 -->

<bean id="startQuartz" lazy-init="false" autowire="no" 

 class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 

<property name="triggers"> 

<list> 

<ref bean="deleteZipTrigger" /> 

</list> 

</property> 

</bean> 

 

<!-- 定义调用对象和调用对象的方法 内存中处理 -->

<bean id="deleteZipJobDetail2"

class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">

<!-- 调用的类 -->

<property name="targetObject">

<ref bean="updateFromAcDataZip" />

</property>

<!-- 调用类中的方法 -->

<property name="targetMethod">

<value>work</value>

</property>

</bean>

<!-- every hour -->

<!-- 定义触发时间 -->

<bean id="deleteZipTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">

<property name="jobDetail">

<ref bean="deleteZipJobDetail2" />

</property>

<property name="cronExpression">

<value>59 59 * * * ?</value>

<!-- <value>0 0/3 * * * ?</value> -->

</property>

</bean>

<!-- 要调用的工作类  内存处理 -->

<bean id="updateFromAcDataZip" class="com.xlwzsoft.acWarehouse.quartz.UpdateFromAcDataZip">

</bean>

</beans>

 

UpdateFromAcDataZip类文件:

public class UpdateFromAcDataZip {

    private static final Logger logger = Logger.getLogger(TaskTestBean.class);

    public UpdateFromAcDataZip(){

   

    }

public void work(){

 

        logger.info("-----------进入自动任务- work!!!-----------");

        logger.info("-----------此次自动任务结束------------");

}

}

 

注:方式2的配置可以作为外部文件导入到applicationContext.xml中去。

测试方法二:

public static void main(String[] args)    {
        System.out.println("----------Test start.-------\n");
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-jobs.xml");
        //如果配置文件中将startQuertz bean的lazy-init设置为false 则不用实例化
        context.getBean("startQuartz");
  }

注:cron表达式

 

附上corn语法及示例

 

corn=[秒 分 时  日 月 周  年]

一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素。 
按顺序依次为 
秒(0~59) 
分钟(0~59) 
小时(0~23) 
天(月)(0~31,但是你需要考虑你月的天数) 
月(0~11) 
天(星期)(1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT) 
7.年份(1970-2099) 
其中每个元素可以是一个值(如6),一个连续区间(9-12),一个间隔时间(8-18/4)(/表示每隔4小时),一个列表(1,3,5),通配符。由于"月份中的日期"和"星期中的日期"这两个元素互斥的,必须要对其中一个设置?. 

0 0/3 * * * ? 每隔三分钟执行一次

59 59 * * * ?每小时执行一次 正好为59分59秒的时候执行
0 0 10,14,16 * * ? 每天上午10点,下午2点,4点 
0 0/30 9-17 * * ?   朝九晚五工作时间内每半小时 
0 0 12 ? * WED 表示每个星期三中午12点 
"0 0 12 * * ?" 每天中午12点触发 
"0 15 10 ? * *" 每天上午10:15触发 
"0 15 10 * * ?" 每天上午10:15触发 
"0 15 10 * * ? *" 每天上午10:15触发 
"0 15 10 * * ? 2005" 2005年的每天上午10:15触发 
"0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发 
"0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发 
"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发 
"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发 
"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发 
"0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发 
"0 15 10 15 * ?" 每月15日上午10:15触发 
"0 15 10 L * ?" 每月最后一日的上午10:15触发 
"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发 
"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发 
"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发 

 

 

参考连接:http://www.open-open.com/lib/view/open1354666663304.html

你可能感兴趣的:(spring配置)