在Spring中可以很方便的使用Quartz来实现定时任务等功能,Quartz主要就是Schedule(任务调度器),Job(作业任务)和Trigger(触发器)三者的关系。

实现方式有多种,在此就介绍两种:

第一种:Job 继承 QuartzJobBean

1.实体

package com.wfcm.quartz;

import com.wfcm.service.WfCollageOrderService;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.quartz.QuartzJobBean;
import org.springframework.stereotype.Component; import java.text.SimpleDateFormat;
import java.util.Date; @Component
public class CollageOrderStatus extends QuartzJobBean { @Autowired
private WfCollageOrderService collageOrderService; private org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(CollageOrderStatus.class); protected void executeInternal(JobExecutionContext context) throws JobExecutionException { log.info("团购订单状态更新任务开始..." + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
this.collageOrderService.updateStatus();
log.info("团购订单状态更新成功!" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
} public void setCollageOrderService(WfCollageOrderService collageOrderService) {
this.collageOrderService = collageOrderService;
} }

2.配置 applicationContext-quartz.xml

   <!--JobDetail  每1分钟自动更新团购订单时间大于3分钟的订单状态为过期-->
<bean name="collageOrderJob" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass" value="com.wfcm.quartz.CollageOrderStatus"/>
<property name="jobDataMap">
<map>
<entry key="collageOrderService" value-ref="wfCollageOrderService"/>
</map>
</property>
<property name="durability" value="true"/>
</bean> <!--trigger-->
<bean id="collageOrderJobCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="collageOrderJob"/>
<property name="cronExpression" value="*/2 * * * * ?"/>
<!--<property name="cronExpression" value="0 */1 * * * ?"/>-->
</bean> <!-- 调度器工厂bean,将作业细节和触发器粘合在一起,以配置Quartz调度器 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="jobDetails">
<list>
<ref bean="collageOrderJob"/>
</list>
</property> <property name="triggers">
<list>
<ref bean="collageOrderJobCronTrigger"/>
</list>
</property>
</bean>

3.引用xml

    <!-- 引入定时器 -->
<import resource="classpath:applicationContext-quartz.xml"/>

第二种:

1. 普通java类

package com.wfcm.quartz;

import com.mysql.jdbc.TimeUtil;import com.wfcm.utils.DateUtil;
import com.wfcm.utils.DateUtils;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.quartz.QuartzJobBean;
import org.springframework.stereotype.Component; import java.text.SimpleDateFormat;
import java.util.Date; @Component
public class RemindTask { private Logger log = LoggerFactory.getLogger(RemindTask.class); public void start(){
System.out.println(DateUtil.format(new Date(),DateUtils.DATE_TIME_PATTERN));
} }

2.xml 配置

 <!-- job -->
<bean id="remindTask" class="com.wfcm.quartz.RemindTask"/>
<!-- 使用MethodInvokingJobDetailFactoryBean,任务类可以不实现Job接口,通过targetMethod指定调用方法-->
<!-- jobDetail -->
<bean id="remindTaskJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!--<property name="targetObject" ref="com.wfcm.quartz.RemindTask"/>
<property name="targetMethod" value="start"/>-->
<!--false表示等上一个任务执行完后再开启新的任务-->
<!--<property name="concurrent" value="false"/>-->
<property name="targetObject">
<ref bean="remindTask"></ref>
</property>
<property name="targetMethod">
<value>start</value>
</property>
</bean>
<!-- Trigger-->
<bean id="remindTaskCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="remindTaskJob"/>
<property name="cronExpression">
<value>0/1 * * * * ?</value>
</property>
<!--<property name="startDelay" value="1"/>-->
<!--<property name="cronExpression" value="0 */2 * * * ?"/>-->
</bean>
<!--Scheduler -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="remindTaskCronTrigger"/>
</list>
</property>
</bean>

3.引用 xml ,和第一种方式一样。

接下来就是测试了,定时任务用哪种方式都可以。

回想一下之前说过的Quartz三个要素:Scheduler、Trigger、JobDetai&Job。对应到xml文件,也就是上面的中的几个bean对象。几个点注意下:

一个scheduler可以对应多个Trigger:看bean对象也看出来了,它的属性是个list集合。

一个job可以对应多个JobDetail:这个其实也好理解,毕竟具体的实现是job实现,但是通过jobDetail去管理job。就好比游戏和外挂,总不能你同一个游戏开两个客户端,你还买2个挂吧?外挂相当于管理游戏的也就是JobDetail,而游戏相等于具体的实现Job。

job可以自己指定方法名: 之前job都是通过实现job接口,实现execute方法。现在只需要通过jobDetai的属性targetMethod指定执行方法,但是需要注意这个jobDetail它是使用MethodInvokingJobDetailFactoryBean作为具体实现。

具体的体系结构从网上copy过来,讲的比较详细:
●Job:是一个接口,只有一个方法void execute(JobExecutionContext context),开发者实现该接口定义运行任务,JobExecutionContext类提供了调度上下文的各种信息。 ●JobDetail:Quartz在每次执行Job时,都重新创建一个Job实例,所以它不直接接受一个Job的实例,相反它接收一个Job实现类,以便运行时通过newInstance()的反射机制实例化Job。因此需要通过一个类来描述Job的实现类及其它相关的静态信息,如Job名字、描述、关联监听器等信息,JobDetail承担了这一角色。 ●Trigger:是一个类,描述触发Job执行的时间触发规则。主要有SimpleTrigger和CronTrigger这两个子类。当仅需触发一次或者以固定时间间隔周期执行,SimpleTrigger是最适合的选择;而CronTrigger则可以通过Cron表达式定义出各种复杂时间规则的调度方案:如每早晨9:00执行,周一、周三、周五下午5:00执行等。 ●Scheduler:代表一个Quartz的独立运行容器,Trigger和JobDetail可以注册到Scheduler中,两者在Scheduler中拥有各自的组及名称,组及名称是Scheduler查找定位容器中某一对象的依据,Trigger的组及名称必须唯一,JobDetail的组和名称也必须唯一(但可以和Trigger的组和名称相同,因为它们是不同类型的)。Scheduler定义了多个接口方法,允许外部通过组及名称访问和控制容器中Trigger和JobDetail。

时间计算:cron  ,可以去这个网站  在线Cron表达式生成http://cron.qqe2.com/

Spring和Quartz整合实现定时任务调度的更多相关文章

  1. spring与quartz整合实现分布式动态创建,删除,改变执行时间定时任务(mysql数据库)

    背景:因为在项目中用到了定时任务,当时想到了spring的quartz,写完发现费了很大功夫,光是整合就花了一上午,其中最大的问题就是版本问题,项目中用的是spring3.2.8的版本,查阅发现,3. ...

  2. spring与quartz整合

    这周学习了quartz定时任务,现在进行总结一下.首先要认识定时任务中几个关键接口,以及各个接口之间是如何联系起来的. 1.关键接口  (1)Scheduler,任务调度的API,它可以用来启动或者终 ...

  3. Spring Boot Quartz 分布式集群任务调度实现

    Spring Boot Quartz 主要内容 Spring Scheduler 框架 Quartz 框架,功能强大,配置灵活 Quartz 集群 mysql 持久化定时任务脚本(tables_mys ...

  4. Spring与Quartz的整合实现定时任务调度 以及crontab的用法

    最近在研究Spring中的定时任务功能,最好的办法当然是使用Quartz来实现.对于一个新手来说,花了我不少时间,这里我写个笔记,给大家参考. 我使用的是Maven来管理项目,需要的Jar包我给大家贴 ...

  5. Spring与Quartz的整合实现定时任务调度(转)

    源:http://kevin19900306.iteye.com/blog/1397744 最近在研究Spring中的定时任务功能,最好的办法当然是使用Quartz来实现.对于一个新手来说,花了我不少 ...

  6. Spring与Quartz的整合实现定时任务调度

    摘自: http://kevin19900306.iteye.com/blog/1397744 最近在研究Spring中的定时任务功能,最好的办法当然是使用Quartz来实现.对于一个新手来说,花了我 ...

  7. Spring与Quartz的整合实现定时任务调度(转)

    最近在研究Spring中的定时任务功能,最好的办法当然是使用Quartz来实现.对于一个新手来说,花了我不少时间,这里我写个笔记,给大家参考.我使用的是Maven来管理项目,需要的Jar包我给大家贴出 ...

  8. Spring结合Quartz实现多任务定时调用(转载)

    Quartz框架提供了丰富的任务调度支持,比如,在 何时执行何种任务,它是一个开源的由OpenSymphony维护的项目,开发者能够在Java EE,或单独的Java SE应用中使用它.无论是简单的任 ...

  9. 初识spring与quartz整合实现定时任务

    参考资料: http://kevin19900306.iteye.com/blog/1397744 引用自别人的博客: 特别注意一点,与Spring3.1以下版本整合必须使用Quartz1,最初我拿2 ...

随机推荐

  1. 进程间的通信—套接字(socket)

      前面说到的进程间的通信,所通信的进程都是在同一台计算机上的,而使用socket进行通信的进程可以是同一台计算机的进程,也是可以是通过网络连接起来的不同计算机上的进程.通常我们使用socket进行网 ...

  2. vue中计算属性和侦听属性

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. Vue父组件像子组件传值--自定义属性

    这里有个注意的地方,Vue实例控制app DIV 大组件,我们在div中天加小组件的时候,传值需要创建自定义的属性 之后在通过props:[‘属性名’] 来把父元素data中的数据传递给子组件 < ...

  4. Linux命令——tac、rev

    tac和rev命令列到一起,并不是功能相似,而是他们都是将输入内容反置. tac -s:使用指定字符串代替换行作为分隔标志 [root@localhost ~]# echo "1,2&quo ...

  5. C++——overloading

    参考 C++——overloading principle analysis operator overloading C语言中,对一个东西进行操作一定要涉及到一个函数,对于自定义类型,为了实现其四则 ...

  6. nginx基础概述

    为什么选择nginx     nginx非常轻量     互联网公司都选择nginx nginx技术成熟,具备的功能时企业最常用使用而且最需要的 适合当前主流架构趋势,微服务.云架构.中间层 统一技术 ...

  7. DDD总览

    DDD总览 领域驱动设计(DDD)编码实践   目录 写在前面DDD总览实现业务的3种常见方式基于业务的分包领域模型的门面——应用服务业务的载体——聚合根实体 vs 值对象聚合根的家——资源库创生之柱 ...

  8. Maven配置环境变量

    Windows: 1:新建系统M2_HOME变量,并把安装maven路径拷贝上去 ​ 2:配置path变量,并把maven路径拷贝上去,这次的maven路径到bin ​ 3:测试maven环境是否配置 ...

  9. 推荐系统(5)---大量项目topk近邻相似度

    Kd树+BBF(最邻近.次邻近查询)Python实现 kd树和BBF算法 精确Top-K检索及其加速方法探讨

  10. 面向对象中特殊方法的补充、isinstance/issubclass/type、方法和函数、反射

    一.面向对象中特殊方法的补充 1.__str__ 能将对象名改成你想要的字符串,但是类型还是类 class Foo(object): def __init__(self): pass def func ...