一、Java普通自定義定時器
1 /** 2 * 自定義一個定時器 3 * @author lw 4 */ 5 public class MyTimer extends Thread{ 6 7 private Long time ; 8 9 public MyTimer(Long time) { 10 this.time = time; 11 } 12 13 @Override 14 public void run() { 15 while(true){ 16 try { 17 Thread.sleep(time); 18 } catch (InterruptedException e) { 19 e.printStackTrace(); 20 } 21 send(); 22 } 23 } 24 /** 25 * 開始執行任務 26 */ 27 public void execute(){ 28 this.start(); 29 } 30 31 /** 32 * 定時任務 33 */ 34 private void send() { 35 System.out.println("任務執行了:" + new Date()); 36 } 37 38 public static void main(String[] args) { 39 MyTimer myTimer = new MyTimer(2000L) ; 40 myTimer.execute(); 41 } 42 43 }
輸出內容:
1 任務執行了:Tue Nov 13 10:10:02 CST 2018 2 任務執行了:Tue Nov 13 10:10:04 CST 2018 3 任務執行了:Tue Nov 13 10:10:06 CST 2018 4 任務執行了:Tue Nov 13 10:10:08 CST 2018 5 任務執行了:Tue Nov 13 10:10:10 CST 2018 6 任務執行了:Tue Nov 13 10:10:12 CST 2018 7 任務執行了:Tue Nov 13 10:10:14 CST 2018 8 任務執行了:Tue Nov 13 10:10:16 CST 2018 9 任務執行了:Tue Nov 13 10:10:18 CST 2018 10 任務執行了:Tue Nov 13 10:10:20 CST 2018
二、使用Java Timer類
1 public class TimerTest { 2 3 public static void main(String[] args) { 4 Timer timer = new Timer(); 5 // 5s后執行 6 // timer.schedule(new MyTask(), 5000); 7 // 馬上執行任務,每隔1000執行一次 8 timer.scheduleAtFixedRate(new MyTask(), new Date(), 1000); 9 } 10 11 } 12 13 // 定時任務,這是一個線程 14 class MyTask extends TimerTask { 15 @Override 16 public void run() { 17 System.out.println("task execute "); 18 } 19 }
Timer也是基於線程來實現的。
三、Quartz框架
Quartz是一個完全由Java編寫的開源作業調度框架,為在Java應用程序中進行作業調度提供了簡單卻強大的機制。Quartz允許開發人員根據時間間隔來調度作業。它實現了作業和觸發器的多對多的關系,還能把多個作業與不同的觸發器關聯。
使用如下:
創建job
1 public class HelloJob implements Job{ 2 3 public void execute(JobExecutionContext context) throws JobExecutionException { 4 JobDetail detail = context.getJobDetail(); 5 String name = detail.getJobDataMap().getString("name"); 6 System.out.println("say hello " + name ); 7 } 8 9 }
測試
1 public class QuartzTest { 2 3 public static void main(String[] args) throws InterruptedException { 4 5 // 創建工廠 6 SchedulerFactory schedulerfactory = new StdSchedulerFactory(); 7 Scheduler scheduler = null; 8 try { 9 // 通過schedulerFactory獲取一個調度器 10 scheduler = schedulerfactory.getScheduler(); 11 12 // 指明job的名稱,所在組的名稱,以及綁定job類 13 JobDetail job = JobBuilder.newJob(HelloJob.class).withIdentity("JobName", "JobGroupName") 14 .usingJobData("name", "quartz").build(); 15 // 定義觸發的條件 16 Trigger trigger = TriggerBuilder.newTrigger().withIdentity("CronTrigger1", "CronTriggerGroup") 17 .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(3).repeatForever()) 18 .startNow().build(); 19 20 // 把作業和觸發器注冊到任務調度中 21 scheduler.scheduleJob(job, trigger); 22 23 // 啟動調度 24 scheduler.start(); 25 26 Thread.sleep(10000); 27 28 // 停止調度 29 scheduler.shutdown(); 30 31 } catch (SchedulerException e) { 32 e.printStackTrace(); 33 } 34 35 } 36 }
步驟:
- 創建job
- 創建工廠,獲取調度器
- 使用JobBuilder通過job生成jobDetail,可以傳遞數據
- 通過TriggerBuilder創建Trigger,可以設置時間
- 通過調度器注冊ob和trigger
- 啟動調度
四、Quarts 和 Spring整合
創建job
1 public class MailJob { 2 3 private void send() { 4 System.out.println("發送郵件了:" + new Date()); 5 } 6 }
配置
1 <description>Quartz配置文件</description> 2 <!-- 定義一個job --> 3 <bean id="mailJob" class="com.lw.jk.job.MailJob"></bean> 4 <!-- 定義一個 MethodInvokingJobDetailFactoryBean--> 5 <bean id="methodInvokingJobDetailFactoryBean" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> 6 <property name="targetObject" ref="mailJob"></property> 7 <property name="targetMethod" value="send"></property> 8 </bean> 9 <!-- 指定時間 --> 10 <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> 11 <property name="jobDetail" ref="methodInvokingJobDetailFactoryBean"></property> 12 <property name="cronExpression" value="0/10 * * * * ? *"></property> 13 </bean> 14 15 <!-- 指定調度器 --> 16 <bean id="schedule" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 17 <property name="triggers"> 18 <list> 19 <ref bean="cronTrigger"/> 20 </list> 21 </property> 22 </bean>
輸出結果:
1 發送郵件了:Sat Apr 15 16:12:00 CST 2017 2 發送郵件了:Sat Apr 15 16:12:10 CST 2017
四、spring 自帶的定時任務:spring-task
spring 自身的spring-task 不依賴任何的第三方框架,實現方式也很簡單:
這里需要做的就是在xml文件中的引入task命名空間,以便后續標簽中的使用:
xmlns:task="http://www.springframework.org/schema/task" http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.2.xsd
1:定義任務類:
1 public class TaskJob { 2 3 public void springJob(){ 4 System.out.println("spring 自身的定時任務"); 5 } 6 }
2:在xml配置文件中配置定時job:
1 <!--配置任務類--> 2 <bean id="beanA" class="bz.beppe.javase.TaskJob"></bean> 3 <!--定義觸發類和觸發方式--> 4 <task:scheduled-tasks scheduler="myScheduler"> 5 <task:scheduled ref="beanA" method="springJob" fixed-rate="5000"/> 6 </task:scheduled-tasks> 7 8 <task:scheduler id="myScheduler" pool-size="10"/>
經過這樣的配置后在在開啟這個定時任務的spring容器后就會開始相應的定時job。