Quartz整合Spring的练习

前段时间做了一个quartz的练习,发现最近学习,都是网上东搜西找的。呵呵。

quartz一个定时任务的框架,类似windows平台的任务计划,linux平台的crontab。

下面就附上代码:

首先是个小例子,代码实现的quartz:

用到的jar包先说一下:

aopalliance-1.0.jar、aspectjweaver-1.5.3.jar、c3p0-0.9.1.1.jar、commons-logging-1.0.4.jar、jta-1.1.jar、log4j-1.2.14.jar、

org.springframework.aop-3.1.0.RELEASE.jar、org.springframework.asm-3.1.0.RELEASE.jar、org.springframework.aspects-3.1.0.RELEASE.jar、

org.springframework.beans-3.1.0.RELEASE.jar、org.springframework.context.support-3.1.0.RELEASE.jar、org.springframework.context-3.1.0.RELEASE.jar、

org.springframework.core-3.1.0.RELEASE.jar、org.springframework.expression-3.1.0.RELEASE.jar、org.springframework.jdbc-3.1.0.RELEASE.jar、

org.springframework.transaction-3.1.0.RELEASE.jar、org.springframework.web.struts-3.1.0.RELEASE.jar、org.springframework.web-3.1.0.RELEASE.jar、

quartz-2.0.2.jar、quartz-all-2.0.2.jar、slf4j-api-1.6.1.jar、slf4j-log4j12-1.6.1.jar、

jar包有些多,有一些是多余的,可以查一下!这里没有清理了!

注意:spring3.0版本中内置的Quartz版本是<2.0的,在使用最新的Quartz包(>2.0)之后,接口不兼容,导致程序报错,下面的quartz配置文件里面注释了解决方法了。

main函数的类,testOne方法包含创建定时工厂和执行要执行的方法。

package com.zyujie.test;

import org.apache.log4j.Logger;
import org.quartz.CronTrigger;
import org.quartz.DateBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

public class SimpleExample {

	private static Logger logger = Logger.getLogger(SimpleExample.class);

	public static void main(String[] args) {
		new SimpleExample().testOne();
	}

	private void testOne() {
		try {
			// 创建一个定时器工厂
			Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
			scheduler.start(); // 启动定时器

			// 创建一个简单的定时器生成器,该生成器根据一定的条件生成需要的定时器,比如按指定的时间间隔重复执行的简单定时器
			SimpleScheduleBuilder schedBuilder = SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1).repeatForever();

			// 创建一个触发器,DateBuilder负责创建复杂的任务
			Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").startAt(DateBuilder.nextGivenSecondDate(null, 2)).withSchedule(schedBuilder).build();
			
			// 创建job明细,我们要执行的任务必须实现org.quartz.Job接口
			JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("job1", "group1").build();

			// 获取定时器
			// 添加job到定时器,需要添加JobDetail和trigger

			scheduler.scheduleJob(jobDetail, trigger);

			// 启动定时器
			// scheduler.shutdown();

		} catch (SchedulerException e) {
			e.printStackTrace();
		}
	}
}

//
1.1 创建一个JobDetail实例,指定SimpleJob  
//JobDetail jobDetail1 = JobBuilder.newJob(SimpleJob.class).withIdentity("job1-1", "group1").build();  
 1.2 通过SimpleTrigger定义调度规则:马上启动,每1秒运行一次,共运行10次  
//Trigger simpleTrigger1 = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")
//.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1).withRepeatCount(10)).startAt(new java.util.Date()).build();  
//
//
//
 2.1 创建一个JobDetail实例,指定SimpleJob  
//JobDetail jobDetail2 = JobBuilder.newJob(SimpleJob.class).withIdentity("job1_2", "group1").build();  
//
 2.2 通过SimpleTrigger定义调度规则:马上启动,每2秒运行一次,共运行3次  
//Trigger simpleTrigger2 = TriggerBuilder.newTrigger().withIdentity("trigger1_2", "group1")
//.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(2).withRepeatCount(3)).startNow().build();  
//
//
//
 3.0 通过SchedulerFactory获取一个调度器实例  
//Scheduler scheduler;
//try {
//	scheduler = StdSchedulerFactory.getDefaultScheduler();
//	
//	scheduler.scheduleJob(jobDetail1, simpleTrigger1); // 注册并进行调度  
//	scheduler.scheduleJob(jobDetail2, simpleTrigger2); // 注册并进行调度  
//	
//	scheduler.start(); // 调度启动  
//} catch (SchedulerException e) {
//	e.printStackTrace();
//} 

下面是要执行的目标类:

package com.zyujie.test;

import java.text.SimpleDateFormat;

import org.apache.log4j.Logger;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class HelloJob implements Job {

	private static Logger logger = Logger.getLogger(HelloJob.class);

	public HelloJob() {

	}

	public void execute(JobExecutionContext arg0) throws JobExecutionException {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		System.out.println("打印:" + sdf.format(new java.util.Date()));
	}

}

执行main方法就可以了。下面是spring整合的quartz,这个用法应该实用,常见一些:

web.xml的配置就不写了,就是load spring主配置文件即可,由于工程中配置,所以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-2.0.xsd 
	http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
	http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">

	<!-- import products module  -->
	<import resource="quartz-config.xml" />	

</beans>

下面是 quartz的配置文件,主要配置了目标类,目标方法,触发时间这些:

<?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:jee="http://www.springframework.org/schema/jee"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd">

	<!-- 要调用的工作类 -->
	<bean id="quartzJob" class="com.zyujie.test.QuartzJob"></bean>
	
	<!-- 定义调用对象和调用对象的方法 -->
	<bean id="jobtask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
		<!-- 调用的类 -->
		<property name="targetObject">
			<ref bean="quartzJob" />
		</property>
		<!-- 调用类中的方法 -->
		<property name="targetMethod">
			<value>work</value>
		</property>
	</bean>
	
	<!-- 定义触发时间 -->
	<!-- <bean id="doTime" class="org.springframework.scheduling.quartz.CronTriggerBean"> -->
	<!-- spring3.0版本中内置的Quartz版本是<2.0的,在使用最新的Quartz包(>2.0)之后,接口不兼容 -->
	<!-- 解决方法是把Quartz版本降低到1.0,或者把spring加到3.1+。根据Spring的建议,将原来的**TriggerBean替换成**TriggerFactoryBean,例如CronTriggerBean 就可以替换成 CronTriggerFactoryBean。替换之后问题解决。-->
	<bean id="doTime" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
		<property name="jobDetail">
			<ref bean="jobtask" />
		</property>
		<!-- cron表达式 -->
		<property name="cronExpression">
			<!-- 每隔10秒执行一次-->
			<value>0/10 * * * * ?</value>
		</property>
	</bean>
	
	<!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序 -->
	<bean id="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="triggers">
			<list>
				<ref bean="doTime" />
			</list>
		</property>
	</bean>

</beans>

下面是quartz配置文件中配置的目标类和方法:

package com.zyujie.test;

import java.text.SimpleDateFormat;

public class QuartzJob {

	public void work() {
		System.out.println("Quartz的任务调度!!!");
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		System.out.println("打印:" + sdf.format(new java.util.Date()));
	}

}

当工程启动的时候,web.xml就会load spring的主配置文件,就是去触发quartz的cron表达式,执行目标类:

执行结果:

Quartz的任务调度!!!
打印:2013-06-17 18:07:40
Quartz的任务调度!!!
打印:2013-06-17 18:07:50

如果要单独去读quartz配置文件,执行目标类里面的方法的话。我们可以通过ApplicationContext去做:

package com.zyujie.test;

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

public class MainTest {

	/**
     * @param args
     */
    public static void main(String[] args)
    {
        System.out.println("Test start...");
        ApplicationContext context = new ClassPathXmlApplicationContext("quartz-config.xml");
        //如果配置文件中将startQuertz bean的lazy-init设置为false 则不用实例化
        //context.getBean("startQuertz");
        System.out.print("Test end...");

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值