Quartz是一个强大的企业级任务调度框架,Spring中继承并简化了Quartz
//在java使用quartz
//在spring中使用quartz
//使用MethodInvokingJobDetailFactoryBean 可以装配任何普通的bean中方法 不用继承
//使用JobDetailBean装配 业务
首先说 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>