博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring定时任务的几种实现方式
阅读量:4327 次
发布时间:2019-06-06

本文共 2925 字,大约阅读时间需要 9 分钟。

转自:https://www.cnblogs.com/wcyBlog/p/4105165.html

 

近日项目开发中需要执行一些定时任务,比如需要在每天早上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

转载于:https://www.cnblogs.com/zhangyfr/p/9863850.html

你可能感兴趣的文章
阶段3 2.Spring_03.Spring的 IOC 和 DI_4 ApplicationContext的三个实现类
查看>>
阶段3 2.Spring_02.程序间耦合_8 工厂模式解耦的升级版
查看>>
阶段3 2.Spring_03.Spring的 IOC 和 DI_6 spring中bean的细节之三种创建Bean对象的方式
查看>>
阶段3 2.Spring_04.Spring的常用注解_3 用于创建的Component注解
查看>>
阶段3 2.Spring_04.Spring的常用注解_2 常用IOC注解按照作用分类
查看>>
阶段3 2.Spring_09.JdbcTemplate的基本使用_5 JdbcTemplate在spring的ioc中使用
查看>>
阶段3 3.SpringMVC·_07.SSM整合案例_02.ssm整合之搭建环境
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第1节零基础快速入门SpringBoot2.0_3、快速创建SpringBoot应用之手工创建web应用...
查看>>
阶段3 3.SpringMVC·_07.SSM整合案例_04.ssm整合之编写SpringMVC框架
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第1节零基础快速入门SpringBoot2.0_5、SpringBoot2.x的依赖默认Maven版本...
查看>>
阶段3 3.SpringMVC·_07.SSM整合案例_08.ssm整合之Spring整合MyBatis框架
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第2节 SpringBoot接口Http协议开发实战_9、SpringBoot基础HTTP其他提交方法请求实战...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第2节 SpringBoot接口Http协议开发实战_12、SpringBoot2.x文件上传实战...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第4节 Springboot2.0单元测试进阶实战和自定义异常处理_19、SpringBoot个性化启动banner设置debug日志...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第4节 Springboot2.0单元测试进阶实战和自定义异常处理_20、SpringBoot2.x配置全局异常实战...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第5节 SpringBoot部署war项目到tomcat9和启动原理讲解_23、SpringBoot2.x启动原理概述...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第4节 Springboot2.0单元测试进阶实战和自定义异常处理_21、SpringBoot2.x配置全局异常返回自定义页面...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第8节 数据库操作之整合Mybaties和事务讲解_32..SpringBoot2.x持久化数据方式介绍...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第8节 数据库操作之整合Mybaties和事务讲解_34、SpringBoot整合Mybatis实操和打印SQL语句...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第8节 数据库操作之整合Mybaties和事务讲解_35、事务介绍和常见的隔离级别,传播行为...
查看>>