標籤:jdk extends com err 高效 trigger 啟動 sql資料庫 mysql
前言:Java定時器目前主要有3種實現方式:JDK組件,Spring Task,Quartz架構。
1. JDK組件
(1) java.util.TimerTask
MyTimerTask.java:
public class MyTimerTask extends TimerTask { @Override public void run() { System.out.println("MyTimerTask, now: " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); } public static void main(String[] args) { Timer timer = new Timer(); timer.schedule(new MyTimerTask(), 1000, 1000); //timer.cancel(); //停止調度器 }}
(2) java.util.concurrent.ScheduledThreadPoolExecutor(JDK5.0+之後推薦使用)
MyScheduledTask.java:
public class MyScheduledTask implements Runnable { public void run() { System.out.println("my scheduled task, now: " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); }}
MyScheduledExecutor.java:
public class MyScheduledExecutor { public static void main(String[] args) { ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(10); ScheduledFuture future = executor.scheduleWithFixedDelay(new MyScheduledTask(), 1000, 1000, TimeUnit.MILLISECONDS); //future.cancel(true); // 停止定時任務,Timer不能停止定時任務,只能關閉調度器 //executor.shutdown(); // 關閉調度器 }}
比較:java.util.concurrent.ScheduledThreadPoolExecutor比java.util.TimerTask更加靈活和高效。
2. Spring Task
(1) 配置方式實現
TaskJob.java:
@Servicepublic class TaskJob { public void job1() { System.out.println("指定Spring定時任務1, now: " + new SimpleDateFormat("yyy-MM-dd HH:mm:ss").format(new Date())); }}
spring.xml:
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:task="http://www.springframework.org/schema/task"...xsi:schemaLocation="...http://www.springframework.org/schema/taskhttp://www.springframework.org/schema/task/spring-task-3.0.xsd"> <!-- 自動注入定時工作群組件 --> <context:component-scan base-package="xxx" /> <!-- 定義定時任務調度策略 --> <task:scheduled-tasks> <task:scheduled ref="taskJob" method="job1" cron="0/1 * * * * ?" /> </task:scheduled-tasks></beans>
(2) 註解方式實現
TaskJob2.java:
@Componentpublic class TaskJob2 { /** * 每隔一秒執行一次 */ @Scheduled(cron="0/1 * * * * ?") public void job2() { System.out.println("註解方式使用spring定時任務架構, now: " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); }}
spring.xml:
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:task="http://www.springframework.org/schema/task"...xsi:schemaLocation="...http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.0.xsdhttp://www.springframework.org/schema/taskhttp://www.springframework.org/schema/task/spring-task-3.0.xsd"> <!-- 自動注入定時工作群組件 --> <context:component-scan base-package="xxx" /> <!-- 啟動註解方式的定時任務 --> <task:annotation-driven /></beans>
3. Quartz
Quartz是一個開源的,功能非常豐富的定時器架構,詳見:http://www.quartz-scheduler.org/。
Quartz可以獨立使用,也可以整合在Spring架構中,詳見:http://projects.spring.io/spring-framework/。
(1) 獨立使用Quartz(詳見Quartz官方樣本):
pom.xml:
<dependencies> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.2.1</version> </dependency> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz-jobs</artifactId> <version>2.2.1</version> </dependency></dependencies>
定義定時任務,MyJob.java:
public class MyJob implements Job { public void execute(JobExecutionContext arg0) throws JobExecutionException { System.out.println("執行Quartz定時任務實現, now: " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); }}
調度定時任務,MyJobSheduler:
public class MyJobSheduler { public static void main(String[] args) { try { JobDetail job = JobBuilder.newJob(MyJob.class).withIdentity("myJob").build(); Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")
.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1).repeatForever())
.build(); Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); scheduler.scheduleJob(job, trigger); scheduler.start(); } catch (SchedulerException e) { e.printStackTrace(); } }}
(2) Spring整合Quartz
如:http://docs.spring.io/spring/docs/5.0.0.M4/spring-framework-reference/htmlsingle/#scheduling-quartz 。
【實現比較】
| 實現方式 |
優點 |
缺點 |
| JDK組件 |
無需引入第三方依賴,控制靈活 |
僅支援簡單任務調度,不支援指定日期等複雜定時任務 |
| Spring Task |
功能相對JDK方式全面(簡單或指定日期等複雜任務調度),支援註解和配置2種方式 |
Spring 3.x及以上版本才支援,詳見: http://www.springframework.org/schema/task,且無法靈活控制任務啟動或停止。 |
| Quartz |
開源,功能全面且強大(簡單或指定日期等複雜任務調度),可獨立使用,也可以與Spring整合 必須在項目中引入quartz依賴 |
在項目中必須引入quartz依賴。 |
【使用總結】
1. J2EE項目
-- 未依賴Spring架構,建議使用Quartz。
-- 引入了Spring 3.x+,如果僅需要簡單定時任務控制,建議使用Spring Task;否則建議使用Quartz。
-- 特別地,在Spring Boot項目中,根據需求可以靈活選擇JDK,Spring Task或者Quartz。
2. 非J2EE項目
-- 簡單定時任務控制,建議使用JDK實現:java.util.concurrent.ScheduledThreadPoolExecutor;否則建議使用Quartz。
附:Linux crontab
在Linux環境下,可以直接使用crontab程式實現簡單的定時任務,比如定時全量備份MySQL資料庫。
詳見:https://wiki.archlinux.org/index.php/Cron_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)
【參考】
http://gong1208.iteye.com/blog/1773177 Spring定時任務的幾種實現
http://www.cnblogs.com/liuyitian/p/4108391.html Spring cron 運算式
http://blog.csdn.net/ethanzhao/article/details/4406017 Linux crontab 命令格式與詳細例子
java定時器實現總結