zoukankan      html  css  js  c++  java
  • spring定时任务的几种实现方式

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

    spring框架来介绍。

    一.分类

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

    1. Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行。一般用的较少,这篇文章将不做详细介绍。
    2. 使用Quartz,这是一个功能比较强大的的调度器,可以让你的程序在指定时间执行,也可以按照某一个频度执行,配置起来稍显复杂,稍后会详细介绍。
    3. Spring3.0以后自带的task,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多,稍后会介绍。
    • 从作业类的继承方式来讲,可以分为两类:

    1. 作业类需要继承自特定的作业类基类,如Quartz中需要继承自org.springframework.scheduling.quartz.QuartzJobBean;java.util.Timer中需要继承自java.util.TimerTask。
    2. 作业类即普通的java类,不需要继承自任何基类。

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

    • 从任务调度的触发时机来分,这里主要是针对作业使用的触发器,主要有以下两种:
    1. 每隔指定时间则触发一次,在Quartz中对应的触发器为:org.springframework.scheduling.quartz.SimpleTriggerBean
    2. 每到指定时间则触发一次,在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<Book> findAllBook(){ //不带参数
    		System.out.println("BookScheduleTask.findAllBook()");
    		return bookService.findBook(1);
    	}
    	}
    //3、在ApplicationContext.xml配置文件中写如下配置:
    	<!-- 自动扫描 -->
    	<context:component-scan base-package="com" />
    	
    	<!-- spring框架的Scheduled定时器 -->
    	<task:scheduled-tasks>
    		<task:scheduled ref="bookScheduleTask" method="findAllBook" cron="0 0 12 * * ?"/>
    	</task:scheduled-tasks>
    
    	说明:(1)<context:component-scan base-package="com" />该配置,相信大家用过spring的都知道是什么意思,
    	         是spring用于扫描注解的
    	      (2)<task:scheduled-tasks>,该配置的作用是定义一个时间计划任务,定义某个类下面某个方法在某个时间执行。
    	         <task:scheduled ref="bookScheduleTask" method="findAllBook" cron="0 0 12 * * ?"/>,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

  • 相关阅读:
    java优雅的使用elasticsearch api
    springboot mybatis优雅的添加多数据源
    java通过shield链接Elasticsearch
    java spark-streaming接收TCP/Kafka数据
    hiveQL求差集
    hiveQL去重
    Ubuntu16.04+Opencv3.3的安装教程
    TensorFlow池化层-函数
    TensorFlow激活函数+归一化-函数
    TensorFlow图像预处理-函数
  • 原文地址:https://www.cnblogs.com/wcyBlog/p/4105165.html
Copyright © 2011-2022 走看看