Java中Spring使用Quartz任务调度定时器

Quartz 任务调度是什么

Quartz 是 OpenSymphony 开源组织在 Job scheduling 领域又一个开源项目,它可以与 J2EE 与 J2SE 应用程序相结合也可以单独使用。Quartz 是一个完全由 Java 编写的开源作业调度框架。不要让作业调度这个术语吓着你。尽管Quartz框架整合了许多额外功能,但就其简易形式看,你会发现它易用得简直让人受不了!

其实,他还是没有解释明白,我简单说一下:Quartz 作业调度就是可以实现定时任务。它可以实现类似 Windows 的任务计划、我们 .Net 下的 Windows 服务实现的定时任务等,而且,它与 Spring 框架结合起来用起来简单到爆,爽的受不了,除了时间设置比较晦涩一点... 这不重要,待会儿告诉你解决方案。

现在有一个需求:用户在我们系统完成某个操作,我们用金币回馈用户,不过不是即时充值给用户,考虑性能问题,我们用异步或者我们打算在凌晨一点统一充值到用户账户,因为这个时间段用户比较少。你会怎么做?

一、新增一个GoldQuartz.java文件

当然你可以和我一样,新增一个cn.mayongfa.quartz Package 包,专门用来放执行定时任务的类。

这个类的目的是用来定时自动给用户加金币的。

@Component
public class GlodQuartz {

 /**
  * 用户自动加金币
  * 每天凌晨一点执行一次
  */
 @Scheduled(cron = "0 0 1 * * ? ")
 public void addUserGold() {
  System.out.println("凌晨一点了,你睡了么?");
 }

 /**
  * 每隔5秒定时清理缓存
  */
 @Scheduled(cron = "*/5 * * * * ? ")
 public void cacheClear() {
  System.out.println("时间又过去5秒了,真令人伤感...");
 }
}

就完成了?嗯,是的,就这么简单。主要涉及到@Scheduled的cron是什么意思,下面会讲怎么写和怎么自动生成,因为现在这样你完全看不明白。

二、配置springMVC-servlet.xml文件

 <!-- 扫描定时作业调度包 -->
 <task:annotation-driven />
 <context:component-scan base-package="cn.mayongfa.quartz"/>

到这其实就这么简单就完成了!好用的受不了。配置这个<task:annotation-driven />有一个前提是你的 xml 文件的beans声明中要有:

xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="
 http://www.springframework.org/schema/task
 http://www.springframework.org/schema/task/spring-task.xsd"

配置完整版请点击 此处查看。

运行查看结果

到这里你就可以根据自己的需求去完成自己想要执行的定时任务了。那我就来仔细讲讲@Scheduled的cron是什么意思?
Cron 表达式包括以下 7 个字段:秒、分、小时、月内日期、月、周内日期、年(可选字段)。

Cron 触发器还利用一系列特殊字符:

  • 反斜线(/)字符表示增量值。例如,在秒字段中“5/15”代表从第 5 秒开始,每 15 秒一次。
  • 问号(?)字符和字母 L 字符只有在月内日期和周内日期字段中可用。问号表示这个字段不包含具体值。所以,如果指定月内日期,可以在周内日期字段中插入“?”,表示周内日期值无关紧要。字母 L 字符是 last 的缩写。放在月内日期字段中,表示安排在当月最后一天执行。在周内日期字段中,如果“L”单独存在,就等于“7”,否则代表当月内周内日期的最后一个实例。所以“0L”表示安排在当月的最后一个星期日执行。
  • 在月内日期字段中的字母(W)字符把执行安排在最靠近指定值的工作日。把“1W”放在月内日期字段中,表示把执行安排在当月的第一个工作日内。
  • 井号(#)字符为给定月份指定具体的工作日实例。把“MON#2”放在周内日期字段中,表示把任务安排在当月的第二个星期一。
  • 星号(*)字符是通配字符,表示该字段可以接受任何可能的值。

你肯定要疯了,所有这些定义看起来可能有些吓人,我现在有一个方法让 cron 表达式变得十分简单。要不要听?

有些人为了方便大家快速写出 cron 表达式,他做了一个生成表达式的网站:http://tools.jb51.net/code/Quartz_Cron_create

你去这个网站,可以非常快速的生成一个合适你的 cron 表达式,快去试试吧。

总结一下

当你需要定时执行一些代码的时候,你就可以用到作业调度了,Quartz 就是为这个而生的,而且它和 Spring 结合起来非常方便。让你代码写的飞快,Quartz 还是前几天我们项目组一个同事告诉我的,我使用了一下,我就被他折服了。

上面的代码都可以访问此地址查看完整的项目示例: http://xiazai.jb51.net/201702/yuanma/SpringQuartzDemo_jb51.rar

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Spring整合Quartz实现定时任务调度的方法

    最近项目中需要实现定时执行任务,比如定时计算会员的积分.调用第三方接口等,由于项目采用spring框架,所以这里结合spring框架来介绍. 编写作业类 即普通的pojo,如下: package com.pcmall.task; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class TaskA { private static Logger logger = LoggerFactory.getLogger(Ta

  • Spring 中使用Quartz实现任务调度

    前言:Spring中使用Quartz 有两种方式,一种是继承特定的基类:org.springframework.scheduling.quartz.QuartzJobBean,另一种则不需要,(推荐使用第二种).下面分别介绍. 1.作业类继承 org.springframework.scheduling.quartz.QuartzJobBean 第一步:定义作业类 java代码 import java.text.SimpleDateFormat; import java.util.Date; i

  • Spring整合TimerTask实现定时任务调度

    一. 前言 最近在公司的项目中用到了定时任务, 本篇博文将会对TimerTask定时任务进行总结, 其实TimerTask在实际项目中用的不多, 因为它不能在指定时间运行, 只能让程序按照某一个频度运行. 二. TimerTask JDK中Timer是一个定时器类, 它可以为指定的定时任务进行配置. JDK中TimerTask是一个定时任务类, 该类实现了Runnable接口, 是一个抽象类, 我们可以继承这个类, 实现定时任务. /** * 继承TimerTask实现定时任务 */ publi

  • Spring内置任务调度如何实现添加、取消与重置详解

    前言 大家应该都有所体会,使用Spring的任务调度给我们的开发带来了极大的便利,不过当我们的任务调度配置完成后,很难再对其进行更改,除非停止服务器,修改配置,然后再重启,显然这样是不利于线上操作的,为了实现动态的任务调度修改,我在网上也查阅了一些资料,大部分都是基于quartz实现的,使用Spring内置的任务调度则少之又少,而且效果不理想,需要在下次任务执行后,新的配置才能生效,做不到立即生效.本着探索研究的原则,查看了一下Spring的源码,下面为大家提供一种Spring内置任务调度实现添

  • Java中Spring使用Quartz任务调度定时器

    Quartz 任务调度是什么 Quartz 是 OpenSymphony 开源组织在 Job scheduling 领域又一个开源项目,它可以与 J2EE 与 J2SE 应用程序相结合也可以单独使用.Quartz 是一个完全由 Java 编写的开源作业调度框架.不要让作业调度这个术语吓着你.尽管Quartz框架整合了许多额外功能,但就其简易形式看,你会发现它易用得简直让人受不了! 其实,他还是没有解释明白,我简单说一下:Quartz 作业调度就是可以实现定时任务.它可以实现类似 Windows

  • java 中Spring task定时任务的深入理解

    java 中Spring task定时任务的深入理解 在工作中有用到spring task作为定时任务的处理,spring通过接口TaskExecutor和TaskScheduler这两个接口的方式为异步定时任务提供了一种抽象.这就意味着spring容许你使用其他的定时任务框架,当然spring自身也提供了一种定时任务的实现:spring task.spring task支持线程池,可以高效处理许多不同的定时任务.同时,spring还支持使用Java自带的Timer定时器和Quartz定时框架.

  • 使用spring整合Quartz实现—定时器功能

    使用spring整合Quartz实现-定时器(Maven项目做演示) 不基于特定的基类的方法 一,开发环境以及依赖的jar包 Spring 4.2.6.RELEASE Maven 3.3.9 Jdk 1.7 Idea 15.04 二,不可少的jar依赖(添加在maven项目里面的pom.xml文件里面) <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context

  • Java中Spring获取bean方法小结

    Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,如何在程序中获取Spring配置的bean呢? Bean工厂(com.springframework.beans.factory.BeanFactory)是Spring框架最核心的接口,它提供了高级IoC的配置机制.BeanFactory使管理不同类型的Java对象成为可能,应用上下文(com.springframework.context.ApplicationContext)建立在BeanFactory基础之上,提供

  • 详解java 中Spring jsonp 跨域请求的实例

    详解java 中Spring jsonp 跨域请求的实例 jsonp介绍 JSONP(JSON with Padding)是JSON的一种"使用模式",可用于解决主流浏览器的跨域数据访问的问题.由于同源策略,一般来说位于 server1.example.com 的网页无法与不是 server1.example.com的服务器沟通,而 HTML 的<script> 元素是一个例外.利用 <script> 元素的这个开放策略,网页可以得到从其他来源动态产生的 JSO

  • java中Spring Security的实例详解

    java中Spring Security的实例详解 spring security是一个多方面的安全认证框架,提供了基于JavaEE规范的完整的安全认证解决方案.并且可以很好与目前主流的认证框架(如CAS,中央授权系统)集成.使用spring security的初衷是解决不同用户登录不同应用程序的权限问题,说到权限包括两部分:认证和授权.认证是告诉系统你是谁,授权是指知道你是谁后是否有权限访问系统(授权后一般会在服务端创建一个token,之后用这个token进行后续行为的交互). spring

  • JAVA 中Spring的@Async用法总结

    JAVA 中Spring的@Async用法总结 引言: 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在spring 3.x之后,就已经内置了@Async来完美解决这个问题,本文将完成介绍@Async的用法. 1.  何为异步调用? 在解释异步调用之前,我们先来看同步调用的定义:同步就是整个处理过程顺序执行,当各个过程都执行完毕,并返回结果. 异步调用则是只是发送了调用的

  • Java中Spring Boot+Socket实现与html页面的长连接实例详解

    Spring Boot+Socket实现与html页面的长连接,客户端给服务器端发消息,服务器给客户端轮询发送消息,附案例源码 功能介绍 客户端给所有在线用户发送消息客户端给指定在线用户发送消息服务器给客户端发送消息(轮询方式) 注意:socket只是实现一些简单的功能,具体的还需根据自身情况,代码稍微改造下 项目搭建 项目结构图 pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xml

  • Java中Spring Boot支付宝扫码支付及支付回调的实现代码

    前言:最近开发支付宝支付功能,总结一下做个分享 官方文档:https://opendocs.alipay.com/apis 支付宝沙箱地址: https://openhome.alipay.com/platform/appDaily.htm?tab=info 支付宝支付流程: 准备工作:获取支付宝沙箱数据(APPID,支付宝网关,RSA2秘,沙箱支付账号等) 集成SpringBoot,使用Java代码发起支付请求 支付宝收到支付请求后,返回HTML代码片段,用于前端展示二维码 扫码支付成功后,支

  • Java中Spring的单例模式使用

    目录 1.spring单例 V.S 设计模式的单例 2.成员变量的解决方式 3.Spring并发问题 4.对实体bean在多线程中的处理 5.spring无状态的支持 6.spring有状态的支持 7.ThreadLocal 8.ThreadLocal使用 9.ThreadLocal V.S synchronized 10.Spring使用ThreadLocal解决线程安全问题 1.spring单例 V.S 设计模式的单例 设计模式单例,在整个应用中只有一个实例 spring单例,在一个IoC容

随机推荐