Spring+Quartz定时任务示例1

该示例需要使用到Spring的核心包和Quartz包,我这里使用的是quartz-1.7.2.jar和Spring3.2.0的核心包

1.写一个基本的Bean

 

/**
 * @ClassName BasicBean
 * @Description TODO<这里用一句话描述这个类的作用>
 * 
 * @author laosan
 * @date 2014-12-11 下午3:40:53
 */
public class BasicBean
{
    public void run(){
        System.out.println("这个是BasicBean");
    }
}

 

 

2.写一个定时任务的工作类,这个类需要继承QuartzJobBean重写executeInternal方法

 

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.SchedulerContext;
import org.springframework.scheduling.quartz.QuartzJobBean;

import com.zlc.task.BasicBean;

/**
 * @ClassName Demo1
 * @Description 定时任务工作类
 * 
 * @author laosan
 * @date 2014-12-11 下午3:11:49
 */
public class Demo1 extends QuartzJobBean
{

    private String author;

    private BasicBean basicBean;

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.springframework.scheduling.quartz.QuartzJobBean#executeInternal(org
     * .quartz.JobExecutionContext)
     * 
     * 定时任务开始执行的方法
     */
    @Override
    protected void executeInternal(JobExecutionContext jobexecutioncontext)
            throws JobExecutionException
    {
        try
        {
            System.out.println("定时任务执行开始……");
            System.out.println("author:" + author);

            // 获取配置文件中注入的Bean
            SchedulerContext ctx = jobexecutioncontext.getScheduler().getContext();
            basicBean = (BasicBean) ctx.get("basicBean");
            basicBean.run();

            System.out.println("定时任务执行完成!");
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    public String getAuthor()
    {
        return author;
    }

    public void setAuthor(String author)
    {
        this.author = author;
    }

    public BasicBean getBasicBean()
    {
        return basicBean;
    }

    public void setBasicBean(BasicBean basicBean)
    {
        this.basicBean = basicBean;
    }
}


3.在Spring配置文件中进行配置

 

 

<?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:aop="http://www.springframework.org/schema/aop"
	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.2.xsd 
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd 
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">

	<!-- 配置定时任务的调度工厂,Spring的autowire属性值为no表示不启用自动装配 -->
	<bean name="quartzScheduler"
		class="org.springframework.scheduling.quartz.SchedulerFactoryBean"
		autowire="no">

		<!-- schedulerContextAsMap属性可以注入在定时任务中需要使用到的其他被Spring管理的Bean -->
		<property name="schedulerContextAsMap">
			<map>
				<entry key="basicBean" value-ref="basicBean"></entry>
			</map>
		</property>
		
		<!-- 将触发器设置到参数中 -->
		<property name="triggers">
			<list>
				<ref bean="demo1" />
			</list>
		</property>
	</bean>

	<!-- 配置定时任务的执行 begin -->
	<bean id="jobDetail_demo1" class="org.springframework.scheduling.quartz.JobDetailBean">

		<!-- 自己定义的定时任务工作类 -->
		<property name="jobClass" value="com.zlc.task.demo1.Demo1" />

		<!-- jobDataAsMap表示向beanId为jobClass的job注入的属性值,注意:注入的属性在类中必须有set方法 -->
		<property name="jobDataAsMap">
			<map>
				<entry key="author" value="laosan" />
			</map>
		</property>
	</bean>

	<!-- 配置定时任务的执行方式(触发器), CronTriggerBean表示指定某一个时间执行, 但是通过配置cronExpression表达式也可以实现按照某一个频率执行定时任务 -->
	<bean id="demo1" class="org.springframework.scheduling.quartz.CronTriggerBean">
		<property name="jobDetail" ref="jobDetail_demo1" />

		<!-- cronExpression表达式,配置定时任务执行的时间或频率 -->
		<property name="cronExpression" value="0 1 10 * * ?" />

		<!-- 定时任务的说明 -->
		<property name="description" value="定时任务示例1" />
	</bean>
	<!-- 配置定时任务的执行 end -->

	<bean id="basicBean" class="com.zlc.task.BasicBean"></bean>
</beans>


4.写一个测试类,让定时任务运行起来

 

 

import java.io.File;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

/**
 * @ClassName Test
 * @Description 测试类
 * 
 * @author laosan
 * @date 2014-12-12 上午8:54:29
 */
public class Test
{
    @SuppressWarnings("unused")
    public static void main(String[] args)
    {
        ApplicationContext atx = new FileSystemXmlApplicationContext("H:\\eclipse\\workspace\\SpringTask\\WebRoot\\WEB-INF" + File.separator + "applicationContext-task.xml");
    }
}


运行测试类,当系统时间达到Spring配置文件中的cronExpression表达式指定的时间,定时任务便会启动

 


红色字部分是测试类启动时,加载Spring配置文件的信息。黑色字部分是定时任务的代码输出。

 

如果想要定时任务以一定的频率执行,例如:每隔十秒执行一次定时任务。

有两种方法可以实现:

第一种:在上面的Spring配置文件中,配置合适的cronExpression表达式。

第二种:将Spring配置文件中的触发器修改如下:

 

	<!-- 第一种配置 -->
	<!-- <bean id="demo1" class="org.springframework.scheduling.quartz.CronTriggerBean">
		<property name="jobDetail" ref="jobDetail_demo1" />
	-->

	<!-- cronExpression表达式,配置定时任务执行的时间或频率 -->
	<!-- <property name="cronExpression" value="0 1 10 * * ?" />
	-->

	<!-- 定时任务的说明 -->
	<!-- <property name="description" value="定时任务示例1" />
	</bean>
	-->

	<!-- 第二种配置方式 -->
	<bean id="demo1" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
		<property name="jobDetail" ref="jobDetail_demo1" />
		
		<!-- 调度工厂实例化后,经过10秒开始执行 -->
		<property name="startDelay" value="10000" />
		
		<!-- 每10秒执行一次 -->
		<property name="repeatInterval" value="10000" />
	</bean> 

 

 


你可能感兴趣的:(quartz,定时任务)