spring定时任务的几种实现方式
近日项目开发中需要执行一些定时任务,比如需要在每天早上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
例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | //一、在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
标签:
定时器
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· 对象命名为何需要避免'-er'和'-or'后缀
· SQL Server如何跟踪自动统计信息更新?
· “你见过凌晨四点的洛杉矶吗?”--《我们为什么要睡觉》
· 提示词工程师自白:我如何用一个技巧解放自己的生产力
· C# 从零开始使用Layui.Wpf库开发WPF客户端
· C#/.NET/.NET Core技术前沿周刊 | 第 31 期(2025年3.17-3.23)
· 如何不购买域名在云服务器上搭建HTTPS服务