Spring为创建Quartz中的Scheduler、JobDetail和Tirgger提供了便利的factoryBean,以便在Spring容器中享受注入的好处,此外,Spring还提供了一些便利的工具直接将Spring中的Bean包装为合法的任务。
1.创建JobDetail
1)通过JobDetailBean
<bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailBean" p:jobClass="com.test.quartz.MyJob" p:applicationContextJobDataKey="applicationContext"> <property name="jobDataAsMap"> <map> <entry key="size" value="10"/> </map> </property> </bean>
package com.test.quartz; import java.util.Map; import org.apache.catalina.core.ApplicationContext; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class MyJob implements Job{ @Override public void execute(JobExecutionContext jctx) throws JobExecutionException { Map dataMap=jctx.getJobDetail().getJobDataMap(); String size=(String) dataMap.get("size"); ApplicationContext applicationContext=(ApplicationContext) dataMap.get("applicationContext"); System.out.println("size:"+size); dataMap.put("size", size+"0");//更改是否可见,取决于任务的类型,如果实现StatefulJob,那么这次更改对于下次执行就是可见的 //do sth } }
2)MethodInvokingJobDetailFactoryBean
可以将Spring Bean包装为任务
<bean id="jobDetail_1" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean" p:targetObject-ref="myService" p:targetMethod="doJob" p:concurrent="false"><!-- 指定任务是否有状态,false为有状态的任务,有状态的任务不能并发执行 --> </bean> <bean id="myService" class="com.test.quartz.MyService"/>
package com.test.quartz; public class MyService { public void doJob(){ System.out.println("in myService.doJob()"); //doJob可以是static,也可以是非static,但是不能有参数,通过MethodInvokingJobDetailFactoryBean创建的JobDetail不能被持久化到数据库,想要持久化,要用正规的Quartz Job实现类 } }
2创建Trigger
1)SimpleTriggerBean
属性:JobDetail beanName jobDataAsMap startDelay延时多少时间开始触发 triggerListenerNames
<bean id="simpleTrigger1" class="org.springframework.scheduling.quartz.SimpleTriggerBean" p:jobDetail-ref="jobDetail" p:startDelay="1000" p:repeatInterval="2000" p:repeatCount="100"> <property name="jobDataAsMap"> <map> <entry key="count" value="10"/> </map> </property> </bean>
package com.test.quartz; import java.util.Map; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.quartz.StatefulJob; public class MyJob implements StatefulJob{ @Override public void execute(JobExecutionContext jctx) throws JobExecutionException { Map dataMap=jctx.getTrigger().getJobDataMap(); String count=(String) dataMap.get("count"); dataMap.put("count", "30"); //do sth } }
2)CronTriggerBean
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean" p:jobDetail-ref="jobDetail" p:cronExpression="0/5 * * * * ?"/>
3 创建 Scheduler
Spring提供了SchedulerFactoryBean,可以以Bean风格方式配置Scheduler,并且让Scheuler和Spring容器生命周期建立关联,相生相息。通过属性配置方式代替quartz自身配置文件
<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="simpleTrigger1"/> </list> </property> <property name="schedulerContextAsMap"> <map> <entry key="timeout" value="30"/> </map> </property> <property name="configLocation" value="classpath:com/test/quartz/quartz.properties" /> </bean>
ScheduleFactoryBean的一些其他属性:
calendars 类型为map
jobDetails 类型为jobDetail[]
autoStartup :ScheduleFactoryBean是否在初始化后,马上启动scheduler,默认为true
startupDelay:ScheduleFactoryBean初始化后,延迟多少秒启动Scheduler,默认为0,马上启动。
ScheduleFactoryBean通过以下属性,代替框架自身的配置文件。
dataSource 可以覆盖quartz.proeprties定义的数据源
transactionManager 设置一个Spring事务管理器
nonTransactionalDataSource 在全局事务情况下,如何用户不希望Schedule执行的相关数据操作参与到全局事务中,可以通过该属性指定数据源。
quartzProperties,类型为Properties,允许用户在Spring中定义quartz属性,其值会覆盖quartz.properties中设置的属性值。
二、拓展
1.Spring中使用JDK Timer
JDK Timer只适合对执行时间非常短的任务进行调度,允许按照固定频率重复执行某项任务。
TimerTask
相当于quartz中的一个job,代表一个任务,两者主要区别是每当执行一个任务,,quartz都会创建一个job实例,而jDK Timer使用相同的TimerTask实例,如果TimerTask是有状态的,这些状态对后面的执行时可见的,3个方法
abstract void run()
boolean cancel() 取消任务
long scheduledExecutionTime(),返回此任务的计划执行时间点。一般在run()方法中调用,判断是否取消本次任务的执行
Timer
在延迟一段时间或指定时间点后执行一次任务或周期性运行任务 Object#wait()进行任务的时间调度。
Timer()
Timer(boolean isDaemon)
Timer(String name)
Timer(String name,boolean isDaemon)
schedule(TimerTask task,Date time)
schedule(TimerTask task,long delay)
schedule(TimerTask task,Date firstTime,long period)
schedule(TimerTask task,long delay,long period)
scheduleAtFixedRate(TimerTask task,Date firstTime,long period)
scheduleAtFixedRate(TimerTask task,long delay,long period)
cancel()
purge()
Spring对JDK Timer的支持
1)使用ScheduleTimerTask
<bean id="timerTask" class="com.test.timer.SimpleTimerTask"/> <bean id="scheduledTask1" class="org.springframework.scheduling.timer.ScheduledTimerTask" p:timerTask-ref="timerTask" p:delay="1000" p:period="1000" p:fixedRate="false"> </bean>
2)使用MethodInvokingTimerTaskFactoryBean
<bean id="myService" class="com.test.quartz.MyService"/> <bean id="scheduledTask2" class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean" p:targetObject-ref="myService" p:targetMethod="doJob"> </bean>
3)TimerFactoryBean
<bean id="timer" class="org.springframework.scheduling.timer.TimerFactoryBean"> <property name="scheduledTimerTasks"> <list> <ref bean="scheduledTask1"/> <ref bean="scheduledTask2"/> </list> </property> </bean>
2 Spring中使用JDK 5.0 Executor
JDK5.0新增了并发工具包,java.util.concurrent,包含了执行器,任务调度框架,线程安全队列,锁,计时器和其他一些同步的基本类型
Executor将任务提交和任务执行解耦。void execute(Runnable runnable)可以通过方法调用提交多个任务 两个子接口 ExecutorService和ScheduledExecutorService,ExecutorService添加了任务结束的方法,可以在提交任务时获取一个Future实例,跟踪任务异步执行情况,ScheduledExecutorService可以进行调度,如ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit);指定任务延时一段时间后执行。
实现:ThreadPoolExecutor类实现了Executor和ExecutorService,ScheduledThreadPoolExecutor实现了ScheduledExecutorService接口,添加了对任务调度的功能。
提供了综合的工厂类Executors
public static ExecutorService newFixedThreadPool(int nThreads)创建一个线程池,复用一组固定的线程运行一个共享的无界队列
public static ExecutorService newCachedThreadPool()线程池是动态的,不够用时创建,空闲时收回
public static ScheduledExecutorService newScheduledThreadPool(
int corePoolSize, ThreadFactory threadFactory)创建一个线程池,可以在延时一段时间后执行或定期执行。
package com.test.executors; import java.util.concurrent.Executor; import java.util.concurrent.Executors; public class ExecutorExample { private Executor executor; public void setExecutor(Executor executor) { this.executor = executor; } public void executorTask(){ for (int i = 0; i < 6; i++) { executor.execute(new SimpleTask("task"+i)); } } class SimpleTask implements Runnable{ private String taskName; public SimpleTask(String taskName){ this.taskName=taskName; } @Override public void run() { System.out.println("do "+taskName +"...in Thread:"+Thread.currentThread().getId()); } } public static void main(String[] args) { ExecutorExample example=new ExecutorExample(); example.setExecutor(Executors.newFixedThreadPool(3)); example.executorTask(); } }
Spring对JDK 5.0 Executor的支持
Spring对Executor所提供的抽象
org.springframework.core.task.TaskExecutor接口等同于Executor接口。
SchedulingTaskExecutor子接口,新增任务调度规则制定的功能‘
Spring提供的一些TaskExecutor的实现
SyncTaskExecutor org.springframework.core.task包中,实现了TaskExecutor接口,这个实现不会异步执行任务,相反每回都在发起调用的主线程中执行。
SimpleSyncTaskExecutor org.springframework.core.task包中,没有使用线程池,每回执行任务时都新创建一个线程,但是对并发总数有限制
ConcurrentTaskExecutor jdk5.0Executor适配器 org.springframework.scheduling.concurrent
SimpleThreadPoolTaskExecutor org.springframework.scheduling.quartz包中,实际上继承Quartz包中SimpleThreadPool类的子类,它监听Spring的生命周期回调
ThreadPoolTaskExecutor.只能在JDK 5.0中使用, org.springframework.scheduling.concurrent ThreadPoolExecutor包装为TaskExecutor
TimerTaskExecutor 该类使用一个Timer作为其后台实现 org.springframework.scheduling.timer
package com.test.executors; import org.springframework.core.task.SimpleAsyncTaskExecutor; import org.springframework.core.task.TaskExecutor; public class ExecutorExample { private TaskExecutor executor; public void setExecutor(TaskExecutor executor) { this.executor = executor; } public void executorTask(){ for (int i = 0; i < 6; i++) { executor.execute(new SimpleTask("task"+i)); } } class SimpleTask implements Runnable{ private String taskName; public SimpleTask(String taskName){ this.taskName=taskName; } @Override public void run() { System.out.println("do "+taskName +"...in Thread:"+Thread.currentThread().getId()); } } public static void main(String[] args) { ExecutorExample example=new ExecutorExample(); example.setExecutor(new SimpleAsyncTaskExecutor()); example.executorTask(); } }
相关推荐
Spring 整合任务调度框架 Quartz 在软件开发中,任务调度框架是非常重要的一部分,它可以帮助开发者更好地管理和执行各种任务。在 Java 领域中,Quartz 是一个非常流行的任务调度框架,而 Spring 是一个非常流行的 ...
Spring中的任务调度是实现应用程序自动化运行任务的重要工具,而Quartz是Java领域广泛使用的开源任务调度框架。在本文中,我们将深入探讨如何在Spring中集成Quartz进行任务调度,并通过一个简单的示例来理解其工作...
spring quartz 时间任务调度框架 spring quartz 时间任务调度框架 spring quartz 时间任务调度框架
Quartz任务调度器是一款强大的开源任务调度框架,广泛应用于Java应用程序中,用于自动化定时任务的执行。它提供了灵活的任务调度机制,使得开发者可以方便地定义、安排和执行各种任务。在与Spring框架整合后,Quartz...
Spring Quartz 是一个强大的任务调度框架,它允许开发者在Java应用程序中定义和执行定时任务。结合Spring框架,可以方便地在企业级应用中实现复杂的时间触发逻辑。本实例提供了可以直接运行的任务调度解决方案,既...
Spring Quartz 是一个基于 Java 的任务调度框架,它允许开发者定义定时任务并在应用程序中灵活地调度这些任务。这个框架是 Spring 和 Quartz Scheduler 的集成,提供了与 Spring 框架的无缝集成,使得在 Spring 应用...
Spring框架和Quartz是两个广泛使用的工具,它们可以协同工作以实现复杂和灵活的任务调度。本篇文章将深入探讨如何使用Spring与Quartz结合来创建一个任务调度的小例子。 首先,Spring是一个开源的Java企业级应用开发...
Quartz是一个强大的、开放源码的作业调度框架,能够创建、触发、跟踪作业,并与应用程序集成。 Quartz的核心概念包括Job(作业)、Trigger(触发器)和Scheduler(调度器)。Job是实际需要执行的任务,Trigger定义...
Quartz是一个功能丰富的作业调度框架,它支持复杂的调度策略,如cron表达式、触发器等。Spring与Quartz的整合使得我们可以利用Spring的依赖注入(DI)和声明式事务管理等功能,进一步增强了Quartz的易用性和可维护性...
- **Quartz简介**:Quartz是一个开源的作业调度框架,支持复杂的调度策略,如按日期、时间间隔或CRON表达式调度任务。 - **Spring与Quartz集成**:Spring通过`org.springframework.scheduling.quartz`包提供了一种...
Quartz是一款开源的作业调度框架,它允许开发者安排任务在特定时间执行,而Spring框架则提供了与Quartz的无缝集成,使得在Spring应用中管理定时任务变得更加便捷。 在Spring中使用Quartz,首先需要引入相关的依赖库...
Quartz 是一个开源的作业调度框架,用于在 Java 应用程序中实现复杂的时间调度任务。它允许开发者定义定时任务,这些任务会在指定的时间点自动执行。Quartz 提供了一套丰富的 API 和支持,可以方便地与 Spring 框架...
Spring集成Quartz是一款高效的任务调度框架,用于在Java应用程序中执行计划、周期性的任务。Quartz与Spring的结合,使得我们可以充分利用Spring的依赖注入(DI)和AOP特性,简化了任务调度的复杂性。 首先,Quartz...
**Spring2.x集成Quartz调度框架** 在Java应用开发中,常常需要进行任务调度,例如定时执行某些业务逻辑。Quartz是一款强大的、开源的作业调度框架,它支持复杂的调度策略和集群环境。Spring框架则提供了良好的企业...
Quartz是一款开源的作业调度框架,支持丰富的调度策略,可以满足各种定时需求。 首先,让我们深入理解Spring整合Quartz的过程。在Spring中,Quartz可以通过以下步骤进行集成: 1. **引入依赖**:在项目的构建文件...
Quartz 是一个开源的任务调度框架,广泛用于Java应用程序中。它提供了强大的任务调度功能,支持复杂的触发机制,并能够处理高负载情况下的任务调度需求。 ##### 官网链接 - [Quartz官方文档]...
Spring Quartz 是一个强大的开源作业调度框架,用于在Java应用程序中实现定时任务的管理。它与Spring框架紧密结合,提供了丰富的API和配置选项,使得在Spring应用中集成和管理定时任务变得非常方便。本教程将深入...
Spring Quartz 是一个强大的开源任务调度框架,它允许开发者在Java应用程序中定义和执行定时任务。在Spring框架中集成Quartz,可以充分利用Spring的IoC(Inversion of Control)和AOP(Aspect Oriented Programming...
Quartz是一个开源的作业调度框架,它可以被用来创建、调度和执行任务,支持复杂的调度策略。其核心特性包括可持久化的作业存储、触发器、多线程执行以及插件扩展。Spring通过其Spring Task模块与Quartz集成,使得在...
### Spring集成Quartz调度框架详解 #### 一、Quartz调度框架概述 Quartz是一个开源的、成熟的作业调度框架,其主要目标是在Java应用程序中提供简单而强大的作业调度能力。Quartz支持作业按时间间隔(如每天、每周...