近日项目开发中需要执行一些定时任务,比如需要在每天早上9:00,准时发布信息,借此机会整理了一下定时任务的几种实现方式,由于项目采用spring框架,所以我都将结合

spring框架来介绍。

一.分类

从实现的技术上来分类,目前主要有三种技术(或者说有三种产品):

Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行。一般用的较少,这篇文章将不做详细介绍。

使用Quartz,这是一个功能比较强大的的调度器,可以让你的程序在指定时间执行,也可以按照某一个频度执行,配置起来稍显复杂,稍后会详细介绍。

Spring3.0以后自带的task,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多,稍后会介绍。

从作业类的继承方式来讲,可以分为两类:

作业类需要继承自特定的作业类基类,如Quartz中需要继承自org.springframework.scheduling.quartz.QuartzJobBean;java.util.Timer中需要继承自java.util.TimerTask。

作业类即普通的java类,不需要继承自任何基类。

注:个人推荐使用第二种方式,因为这样所以的类都是普通类,不需要事先区别对待。

从任务调度的触发时机来分,这里主要是针对作业使用的触发器,主要有以下两种:

每隔指定时间则触发一次,在Quartz中对应的触发器为:org.springframework.scheduling.quartz.SimpleTriggerBean

每到指定时间则触发一次,在Quartz中对应的调度器为:org.springframework.scheduling.quartz.CronTriggerBean

注:并非每种任务都可以使用这两种触发器,如java.util.TimerTask任务就只能使用第一种。Quartz和spring task都可以支持这两种触发条件。

二.用法

1、Java自带的java.util.Timer类,自定义一个类继承TimerTask

例子:

package com.timertest;

import java.util.Timer;

import java.util.TimerTask;

public class TestTimerTask {

Timer timer;

public TestTimerTask(int a) {

timer = new Timer();

timer.schedule(new GoodTimerTask(),0, 1000*a);

}

public static void main(String[] args) {

System.out.println("About to schedule task.");

new TestTimerTask(3);

}

class GoodTimerTask extends TimerTask{

@Override

public void run() {

System.out.println("Timer running!");

}

}

}

2、Spring3.0以后自带的task

//一、在applicationContext.xml配置的方式

//1、准备jar包

// (1)spring核心jar包

//2、在项目中写个类

@Service

public class BookScheduleTask {

@Resource

private BookService bookService;

public Page findAllBook(){ //不带参数

System.out.println("BookScheduleTask.findAllBook()");

return bookService.findBook(1);

}

}

//3、在ApplicationContext.xml配置文件中写如下配置:

说明:(1)该配置,相信大家用过spring的都知道是什么意思,

是spring用于扫描注解的

(2),该配置的作用是定义一个时间计划任务,定义某个类下面某个方法在某个时间执行。

,ref表示的是

某个要在规定时间执行的类,method表示要执行的类下的某个方法,cron表示时间表达式,具体详细的表达式

可以百度查询。

//二、基于注解的spring定时器

// 1、同上,准备好spring的jar包

// 2、在项目中创建一个类,用于执行定时任务的类。如下:

@Component("bookScheduleTask")

public class BookScheduleTask {

@Resource

private BookService bookService;

@Scheduled(cron="0 50 14 * * ?")

public void findAllBook(){

System.out.println("BookScheduleTask.findAllBook()");

bookService.findBook(1);

}

}

// 说明:基于注解的方法,@Component("bookScheduleTask")表示定义了一个别名。

//@Scheduled(cron="0 50 14 * * ?")表示:该注解下的方法是一个时间任务,在cron="0 50 14 * * ?"(14:50)执行findAllBook()方法

3、使用quartz,重量级框架,该方式详见

http://gong1208.iteye.com/blog/1773177

spring java 定时任务_spring定时任务的几种实现方式相关推荐

  1. java foreach hashmap_在 Java 中遍历 HashMap 的5种最佳方式

    在本文中,我们将通过示例讨论在 Java 上遍历  HashMap  的五种最佳方式. 使用  Iterator  遍历 HashMap EntrySet 使用  Iterator  遍历 HashM ...

  2. Java中List集合的三种遍历方式(全网最详)

    Map集合:链接: Map集合的五种遍历方式及Treemap方法 Set集合:链接: Java中遍历Set集合的三种方法 TreeSet集合:链接: Java深入了解TreeSet,和迭代器遍历方法 ...

  3. java线程的任务的三种创建方式,严格地说,就一种,就是如何重写Runnable接口的run()方法

    仅简单演示Java中线程任务的三种创建方式 第一种:使用了适配器模式,有返回值,能抛出异常,任务代码写在Callable.call()方法中,Runnable的run方法会通过适配器调用到Callab ...

  4. java 异步定时任务_spring 定时任务 异步调用

    本篇仅限于 Spring 定时任务 & 异步调用的基本使用,不涉及深入原理探究,先学会怎么用,再探究原理. 环境:SpringBoot 2.0 定时任务指的是应用程序在指定的时间执行预先定义好 ...

  5. spring java配置_Spring Java配置

    spring java配置 我发现许多我认识的Spring开发人员仍然不了解或使用Spring Java Configuration(aka JavaConfig). Spring 3.0引入了此功能 ...

  6. spring java配置_Spring:使基于Java的配置更加优雅

    spring java配置 大家好,我很久没有写新文章了. 积累了很多资料,需要在不久的将来在我的博客中发布. 但是现在我想谈谈Spring MVC应用程序配置. 确切地说,我想谈谈基于Java的Sp ...

  7. spring 整合 mybatis 中数据源的几种配置方式

    因为spring 整合mybatis的过程中, 有好几种整合方式,尤其是数据源那块,经常看到不一样的配置方式,总感觉有点乱,所以今天有空总结下. 一.采用org.mybatis.spring.mapp ...

  8. java servlet接口开发_servlet三种实现方式之一实现servlet接口

    servlet有三种实现方式: 1.实现servlet接口 2.继承GenericServlet 3.通过继承HttpServlet开发servlet 第一种示例代码如下(已去掉包名): import ...

  9. Spring 依赖注入的理解及三种注入方式

    Spring 依赖注入概念和三种注入方式(理解及应用) 什么是注入 要了解Spring的三种注入方式首先前提是得先了解一下什么是注入,相信很多人对这个概念都是模糊不清的,网上的解释是这样的: 依赖注入 ...

  10. Java本地高性能缓存的几种实现方式

    Java缓存技术可分为远端缓存和本地缓存,远端缓存常用的方案有著名的redis和memcache,而本地缓存的代表技术主要有HashMap,Guava Cache,Caffeine和Encahche. ...

最新文章

  1. 如何将光标定位到行尾
  2. 前端框架 渐进式框架
  3. 从零开始编写自己的C#框架(18)——Web层后端权限模块——菜单管理
  4. Android Studio 日志工具
  5. c++将文本中的字符串一次读入到内存
  6. java media.player_关于Java:如何正确发布Android MediaPlayer
  7. CSS 文本缩进text-indent属性
  8. nms python代码_?标检测中的?极?值抑制算法(nms):python代码解析
  9. Open3d之多视角点云配准
  10. php preg_match 只匹配第一个字符_PHP正则表达式核心技术完全详解 第3节
  11. 苹果手机vnc进linux的服务器,linux服务器vnc远程连接,怎么使用linux服务器进行vnc远程连接?...
  12. 防止系统页面被加载进 iframe 子窗口
  13. java读取Excel文件并各方案对比
  14. new QPushbutton 时程序崩溃
  15. ORA-39126\ORA-06502\LPX-00225: end-element tag “HIST_GRAM_LIST_ITEM“ does not match start-element ta
  16. ISCC2021-部分题目再现
  17. linux 图片压缩命令,Linux:优化和压缩JPEG和PNG图片的命令行工具
  18. error: File: XX 520.13 MB, exceeds 100.00 MB以上大文件导致push失败解决方法
  19. 上海域格ASR和高通模块 USB端口分配及Linux下拨号说明
  20. iOS7到iOS8 一个通用的横竖屏幕切换总结

热门文章

  1. oracle忘记sys密码处理
  2. PetShop 4.0学习笔记:消息队列MSMQ
  3. 使用git命令把自己的代码上传到gitlab上
  4. 或许是介绍Android Studio使用Git最详细的文章
  5. 牛腩学ASP.NET CORE做博客(视频)
  6. [System Design] 系统设计 (2) -- 数据库设计
  7. Web API应用架构在Winform混合框架中的应用(5)--系统级别字典和公司级别字典并存的处理方式...
  8. Activity的几种启动模式介绍
  9. 中国网站备案制度——祸国殃民
  10. console_init初始化的研究