转自http://resp.iteye.com/blog/1490575
最近实现了一个业务,刚好需要用到Spring 触发器,特写了一个Spring 触发器Demo供大家学习参考!
Demo简单的实现了定时报时功能,通过Spring 触发器实现每分钟报一次时间!
Demo结构如下:
运行结果如下:
简单解释一下Quartz:
Quartz调度器为调度工作提供了更丰富的支持。和Java定时器一样,可以使用Quartz来每隔多少毫秒执行一个工作。但Quartz比Java Timer更先进之处在于它允许你调度一个工作在某个特定的时间或日期执行。关于Quartz的更多信息,可以访问Quartz位于http://www.opensymphony.com/quartz的主页。
在简单介绍下创建触发器的步骤:
首先需要创建一个工作类,这个类必须继承Spring的QuartzJobBean 。
- package jobs;
-
- import org.quartz.JobExecutionContext;
- import org.quartz.JobExecutionException;
- import org.springframework.scheduling.quartz.QuartzJobBean;
- import service.ITellingTheTimeService;
-
-
- /**
- * @ProjectName:报时Demo
- * @ClassName:TellingTheTimeJob
- * @Description:
- * @author:Sheep
-
* @date:2012-4-19 下午03:58:11
- * @Modifier:
- * @Modify Date:
- * @Modify Note:
- * @version
- */
- public class TellingTheTimeJob extends QuartzJobBean {
-
- private ITellingTheTimeService tellingTheTimeService = null;
-
- @Override
- protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException {
- //调用报时方法
- this.tellingTheTimeService.tellingTheTime();
- }
-
- public ITellingTheTimeService getTellingTheTimeService() {
- return tellingTheTimeService;
- }
-
- public void setTellingTheTimeService(
- ITellingTheTimeService tellingTheTimeService) {
- this.tellingTheTimeService = tellingTheTimeService;
- }
- }
package jobs;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
import service.ITellingTheTimeService;
/**
* @ProjectName:报时Demo
* @ClassName:TellingTheTimeJob
* @Description:
* @author:Sheep
* @date:2012-4-19 下午03:58:11
* @Modifier:
* @Modify Date:
* @Modify Note:
* @version
*/
public class TellingTheTimeJob extends QuartzJobBean {
private ITellingTheTimeService tellingTheTimeService = null;
@Override
protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException {
//调用报时方法
this.tellingTheTimeService.tellingTheTime();
}
public ITellingTheTimeService getTellingTheTimeService() {
return tellingTheTimeService;
}
public void setTellingTheTimeService(
ITellingTheTimeService tellingTheTimeService) {
this.tellingTheTimeService = tellingTheTimeService;
}
}
QuartzJobBean是Quartz中与Java的TimerTask等价的类。它实现了org.quartz.Job接口。executeInternal()方法定义了当预定的时刻来临时应该执行哪些动作。
接着我们须在Sping配置文件中声明这个Job。
-
-
<bean id="tellTheTimeJob" class="org.springframework.scheduling.quartz.JobDetailBean">
-
<property name="jobClass" value="jobs.TellingTheTimeJob"/>
-
<property name="jobDataAsMap">
-
<map>
-
<entry key="tellingTheTimeService" value-ref="tellingTheTimeService"></entry>
-
</map>
-
</property>
-
</bean>
<!-- 配置一个Job -->
<bean id="tellTheTimeJob" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="jobs.TellingTheTimeJob"/>
<property name="jobDataAsMap">
<map>
<entry key="tellingTheTimeService" value-ref="tellingTheTimeService"></entry>
</map>
</property>
</bean>
JobDetailBean 是Quartz的org.quartz.JobDetail的子类,它要求通过jobClass属性来设置一个Job对象。
使用Quartz的JobDetail中的另一个特别之处是TellingTheTimeJob 的tellingTheTimeService 属性是间接设置的。JobDetail的jobDataAsMap属性接受一个java.util.Map,其中包含了需要设置给jobClass的各种属性。在这里,这个map包含了一个指向tellingTheTimeService的引用,它的键值为tellingTheTimeService 。当JobDetailBean实例化时,它会将tellingTheTimeService注入到TellingTheTimeJob 的tellingTheTimeService属性中。
一个Job定义好了,那么我们怎么来实现触发器来调用这个Job呢?接着我们需要在Sping配置触发器。
Spring提供了两个触发器,SimpleTriggerBean和CronTriggerBean。
我们现在看看SimpleTriggerBean是怎么配置的,如下:
-
-
<bean id="simpleTellTheTimeTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
-
<property name="jobDetail">
-
<ref bean="tellTheTimeJob" />
-
</property>
-
-
<property name="startDelay">
-
<value>60000</value>
-
</property>
-
-
<property name="repeatInterval">
-
<value>60000</value>
-
</property>
-
</bean>
<!-- 简单的触发器 -->
<bean id="simpleTellTheTimeTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail">
<ref bean="tellTheTimeJob" />
</property>
<!-- 以毫秒为单位,启动后一分钟触发 -->
<property name="startDelay">
<value>60000</value>
</property>
<!-- 每间隔一分钟触发一次 -->
<property name="repeatInterval">
<value>60000</value>
</property>
</bean>
SimpleTriggerBean与ScheduledTimerTask类似。你可以用它来指定一个工作应该以怎样的频度运行,以及(可选地)在第一次运行工作之前应该等待多久。其中,jobDetail 属性告诉触发器调度哪个工作。
我们再来看看CronTriggerBean是怎么配置的,如下:
-
-
<bean id="complexTellTheTimeTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
-
<property name="jobDetail">
-
<ref bean="tellTheTimeJob"/>
-
</property>
-
<property name="cronExpression">
-
-
<value>0 0/1 * * * ?</value>
-
</property>
-
</bean>
<!-- 复杂的触发器 -->
<bean id="complexTellTheTimeTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="tellTheTimeJob"/>
</property>
<property name="cronExpression">
<!-- 这里是重点,可以自定义表达式实现定时触发。以下含义是每分钟触发一次 -->
<value>0 0/1 * * * ?</value>
</property>
</bean>
和SimpleTriggerBean一样,jobDetail属性告诉触发器调度哪个工作。属性cronExpression告诉触发器何时触发。我们可以通过配置cronExpression属性的value值来实现赋值的触发逻辑。
一个cron表达式有至少6个(也可能是7个)由空格分隔的时间元素。从左至右,这些元素的定义如下:
1.秒(0–59)
2.分钟(0–59)
3.小时(0–23)
4.月份中的日期(1–31)
5.月份(1–12或JAN–DEC)
6.星期中的日期(1–7或SUN–SAT)
7.年份(1970–2099)
每一个元素都可以显式地规定一个值(如6),一个区间(如9-12),一个列表(如9,11,13)或一个通配符(如*)。“月份中的日期”和“星期中的日期”这两个元素是互斥的,因此应该通过设置一个问号(?)来表明你不想设置的那个字段。表7.1中显示了一些cron表达式的例子和它们的意义:
一些cron表达式的例子
表 达 式 意 义
0 0 10,14,16 * * ? 每天上午10点,下午2点和下午4点
0 0,15,30,45 * 1-10 * ? 每月前10天每隔15分钟
30 0 0 1 1 ? 2012 在2012年1月1日午夜过30秒
到了这里所需的一切都准备好了,那么如果启动这个触发器呢?我们需要在Sping XML如下配置:
-
-
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
-
<property name="triggers">
-
<list>
-
<ref bean="complexTellTheTimeTrigger"/>
-
-
</list>
-
</property>
-
</bean>
<!-- Spring触发工厂 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="complexTellTheTimeTrigger"/>
<!-- ....下面可以继续添加其他触发器 -->
</list>
</property>
</bean>
Spring的SchedulerFactoryBean 是Quartz中与TimerFactoryBean等价的类。属性triggers接受一组触发器。因此只需简单地装配一个包含complexTellTheTimeTrigger的一个引用的即可。
分享到:
相关推荐
里面包含了两个工程项目: 1.Java project工程(含jar包,JDK1.6)。 是spring+quartz的任务调度实例。 2.Java web工程(含jar包,JDK1.7)。 spring+mybatis+quartz任务调度实例
Quartz是一个开源的作业调度框架,常用于创建和执行定时任务。在"spring+springMVC+mybatis+quartz动态定时任务创建"项目中,Quartz扮演着关键角色。它可以动态地添加、修改或删除定时任务,这在需要根据业务需求...
Spring框架是Java领域最流行的应用框架之一,而Quartz则是广受欢迎的定时任务调度库。"定时框架spring+quartz"的结合,就是将Quartz的定时功能与Spring的强大集成能力完美融合,为开发者提供了一种高效、灵活的定时...
Spring 和 Quartz 是两个在 Java 开发中非常重要的框架,它们分别用于依赖注入和任务调度。Spring 是一个全方位的 Java 应用开发框架,提供了一系列强大的功能,如 AOP(面向切面编程)、DI(依赖注入)、事务管理等...
这包括`SchedulerFactoryBean`,用于初始化和管理Quartz调度器,以及`JobDetail`和`Trigger`,它们分别定义了任务和触发执行任务的规则。 3. **定义Job**:编写实现`org.quartz.Job`接口的类,这是实际执行的任务...
【标题】"Spring+Quartz+Maven项目实例"是一个基于Spring框架集成Quartz作业调度库的实战项目,采用Maven作为构建工具。这个实例旨在展示如何在Java应用程序中实现定时任务,支持两种运行模式,既可以直接以独立的...
【Spring + Quartz 框架整合详解】 Spring 和 Quartz 是两个在 Java 开发领域中非常重要的框架。Spring 是一个全面的、开源的应用框架,提供依赖注入(DI)、面向切面编程(AOP)以及用于简化企业级应用开发的其他...
### 三、Quartz调度策略 Quartz提供了多种调度策略,包括: - **简单触发器(SimpleTrigger)**:按固定间隔重复执行任务。 - **Cron触发器(CronTrigger)**:基于Cron表达式来定义触发时间,支持复杂的定时规则...
Spring 和 Quartz 是两个在 Java 开发中非常重要的框架。Spring 是一个全面的后端开发框架,提供了依赖注入、AOP(面向切面编程)、MVC(模型-视图-控制器)等众多功能,极大地简化了Java应用的构建。而Quartz则是一...
2. **Spring配置文件**:在Spring的XML配置文件中,我们需要声明一个`SchedulerFactoryBean`,它是Spring对Quartz调度器的封装。通过这个bean,我们可以配置Quartz的相关属性,如JobStore类型(内存或数据库存储),...
Spring框架以其强大的功能和灵活的扩展性,成为Java开发的首选,而Quartz作为一款开源的作业调度库,能够很好地与Spring集成,提供定时任务的解决方案。本教程将详细讲解如何利用Spring 4.3.15、Spring MVC 4.3.15和...
封装通用的Spring3+Struts2+MyBatis3的CRUD+条件分页查询,Spring+Quartz调度,FunctionCharts图像化工具 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi=...
本项目"spring+quartz任务调度代码版"显然是一个结合了这两者的实践案例,旨在展示如何在Spring环境下集成和使用Quartz进行任务调度。 Spring框架是一个开源的应用框架,它提供了丰富的功能,包括依赖注入、AOP...
`SchedulerFactoryBean`是Spring提供的用于创建Quartz调度器的bean,`triggers`属性的列表包含了需要调度的任务触发器。在这里,`startQuertz`会在容器启动时立即执行调度程序。 关于cron表达式的值,我们可以看到...
Quartz是Java领域广泛使用的定时任务库,它支持复杂的调度策略,如周期性执行、一次性任务等。在这个系统中,Quartz作为核心的定时任务引擎,允许管理员动态创建、编辑、删除和修改定时任务。所有的任务配置信息,...
总结起来,"Spring+Quartz定时集群支持"涉及到的知识点主要包括:Spring与Quartz的集成、Quartz的集群配置、`MethodInvokingJobDetailFactoryBean`的使用、数据库表的设计以及通过IHS等手段实现的任务调度。...
2. 配置Quartz:在Spring的配置文件中,我们需要定义一个`SchedulerFactoryBean`,这是Quartz调度器的Spring Bean,可以设置相关属性,如线程池大小、是否自动启动等。 ```xml <bean id="scheduler" class="org....
标题 "spring+mybatis+quartz" 暗示了我们正在探讨一个使用Spring框架、MyBatis持久层框架和Quartz作业调度器的集成应用。这个组合在企业级Java应用中非常常见,用于实现复杂的数据操作、服务管理和定时任务。 ...
这是一个基于Spring Boot、Apache Shiro、Spring MVC、MyBatis、Quartz和Druid的数据源管理框架的示例项目,名为"renren-security"。这个DEMO提供了完整的权限管理和任务调度解决方案,下面是这些技术栈的核心知识点...
开发者可以通过 Spring 的 XML 配置或者注解方式来定义 Quartz 作业和触发器,使得任务调度更加灵活和易于管理。 在实际开发中,Spring 与 Quartz 的整合步骤通常包括以下几个部分: 1. 添加依赖:在项目中引入 ...