spring 第11天 quartz任务调度

Quartz是一个强大的企业级任务调度框架,Spring中继承并简化了Quartz


首先说 jar的问题
从Spring3.2.4才开始支持quartz-2.x

如果版本低于 3.2.4 需要导入 quartz-1.x,commons-collections-3.1.jar,jboss-transaction-api_1.1_spec-1.0.0.Final.jar(javax.transaction.UserTransaction.class)

//在java使用quartz

package quartz;

import java.util.Date;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

/**
 * 定义quartz作业类
 * 单独 使用quartz
 *
 */
public class BuzJob implements Job {
	private boolean isRunning=false;
	
	@Override
	public void execute(JobExecutionContext arg0) throws JobExecutionException {
		// TODO Auto-generated method stub
		if(!isRunning){
			System.out.println(new Date()+" 作业被调度.");
			for (int s = 0; s < 100; s++) {
				System.out.println("作业完成"+(s+1)+"%");
				try {
					Thread.sleep(1000);
					
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
			System.out.println(new Date()+" 作业调度结束.");
		}else{
			System.out.println(new Date()+" 任务退出");
		}
	}

}

//test
package quartz;

import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;

/**
 * 使用quartz的调度器
 * @author Bin
 *
 */
public class MyQuartzService {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			startScheduler();
		} catch (SchedulerException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public static void startScheduler() throws SchedulerException{
		Scheduler sch=StdSchedulerFactory.getDefaultScheduler();
		
		JobDetail d=new JobDetail("buz", Scheduler.DEFAULT_GROUP, BuzJob.class);
		//重复调度2次,间隔 60s
		Trigger t=new SimpleTrigger("buz", Scheduler.DEFAULT_GROUP, 2, 60000);
		sch.scheduleJob(d, t);
		sch.start();
	}

}




//在spring中使用quartz
//使用MethodInvokingJobDetailFactoryBean 可以装配任何普通的bean中方法 不用继承

package quartz;

public class QuartzJob {

	public void work(){
		System.out.println("Quartz调度");
	}
}

 <!-- step:1 定义 quartz业务类-->
 <!--定义一个  工作业务类,要做的事情-->
 <bean id="quartzjob" class="quartz.QuartzJob"/>

<!-- step:2  对业务类进行详情描述-->
   <!--采用  MethodInvokingJobDetailFactoryBean 装配 任务详情 -->
   <bean id="jobtask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
		<property name="targetObject" ref="quartzjob"/>
	   <property name="targetMethod" value="work"/>
	   <property name="concurrent" value="false" />
	   <!-- 是否允许任务并发执行。当值为false时,表示必须等到前一个线程处理完毕后才再启一个新的线程 -->
   </bean>

  <!-- 装配触发器 -->
   <bean id="dotime" class="org.springframework.scheduling.quartz.CronTriggerBean">
   		<property name="jobDetail" ref="jobtask"/>
   		<property name="cronExpression" value="0 * 20 * * ?"/>
   </bean>

 <!-- 配置一个线程执行器,用于任务注册 -->
   <bean id="executor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
   		<property name="corePoolSize" value="10"/>
   		<property name="maxPoolSize" value="100"/>
   		<property name="queueCapacity" value="500"/>
   </bean>
  
   <!-- step:4 将触发器  交给调度工厂 -->
   <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="triggers">
			<list>
				<ref local="cronTriggerPunch"/>
				<ref local="dotime"/>
				<ref local="cronTriggerPunch1"/>
			</list>
		</property>
		<property name="taskExecutor" ref="executor"/> 
		<property name="autoStartup" value="true"/>
		<property name="startupDelay" value="60"/>
	</bean>


//使用JobDetailBean装配 业务

package quartz;

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

import annotation.model.interfaces.Dog;

public class PunchJob extends QuartzJobBean {

	private boolean isRunning=false;
	
	private Dog dog;
	public void setDog(Dog dog) {
		this.dog = dog;
	}

	@Override
	protected void executeInternal(JobExecutionContext context)
			throws JobExecutionException {
		// TODO Auto-generated method stub
		if(!isRunning){
			System.out.println("开始工作");
			dog.sound();
			isRunning=false;
		}
	}

}

   <!--step:3 对已经详情描述过的bean,装配给 触发器 -->
   <bean id="cronTriggerPunch" class="org.springframework.scheduling.quartz.CronTriggerBean">
		<!-- 采用嵌套类 bean-->
		<property name="jobDetail">
			<!--使用JobDetailBean 装配任务详情   -->
			<bean class="org.springframework.scheduling.quartz.JobDetailBean">
				<property name="jobClass" value="quartz.PunchJob"/>
				<property name="jobDataAsMap">
					<map>
						<entry key="dog" value-ref="bagong"/>					
					</map>
				</property>
			</bean>
		</property>
		<property name="cronExpression" value="0 0/1 * * * ?"/>
	</bean>

  <!-- PunchJob1:m没有采用 嵌套bean -->
   <bean id="punchjobDetail" class="org.springframework.scheduling.quartz.JobDetailBean">
   	   <property name="jobClass" value="quartz.PunchJob1"/>
   	   <property name="jobDataAsMap">
			<map>
				<entry key="dog" value-ref="rifle"/>					
			</map>
		</property>
   </bean>

<bean id="cronTriggerPunch1" class="org.springframework.scheduling.quartz.CronTriggerBean">
		<property name="jobDetail" ref="punchjobDetail"/>
		<property name="cronExpression" value="0 0/1 * * * ?"/>
	</bean>





<!-- step:4 将触发器  交给调度工厂 -->
   <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="triggers">
			<list>
				<ref local="cronTriggerPunch"/>
				<ref local="dotime"/>
				<ref local="cronTriggerPunch1"/>
			</list>
		</property>
		<property name="taskExecutor" ref="executor"/> 
		<property name="autoStartup" value="true"/>
		<property name="startupDelay" value="60"/>
	</bean>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值