JDK自带的Timer定时器实现每天24点修改数据
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                JDK自带的Timer定时器实现每天24点修改数据
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                Java項目中常使用的定時器有JDK Timer、Quartz、Spring Task等三種。Quartz的功能強大,配置也比較復雜,適合大型、多定時任務的項目使用。Spring Task配置較為簡單輕量,需要Spring框架支持。JDK自帶的定時器Timer使用靈活,配置簡單,適合中小型項目。
Timer和TimerTask
Timer是jdk中提供的一個定時器工具,使用的時候會在主線程之外起一個單獨的線程執行指定的計劃任務,可以指定執行一次或者反復執行多次。
TimerTask是一個實現了Runnable接口的抽象類,代表一個可以被Timer執行的任務。
定時需要有一個觸發的方法,項目使用監聽器實現定時任務觸發
一、web.xml配置
<listener><listener-class>com.cgb.tspsystem.listener.TimerTaskListener</listener-class> </listener>二、TimerTaskListener
package com.cgb.tspsystem.listener;import java.util.Calendar; import java.util.Date; import java.util.Timer;import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener;import com.cgb.tspsystem.utils.TaskMethod;public class TimerTaskListener implements ServletContextListener{/*public static void main(String[] args) {Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.HOUR_OF_DAY, 24); // 24點 可以更改時間 calendar.set(Calendar.MINUTE, 0); // 0分 可以更改分數 calendar.set(Calendar.SECOND, 0);// 0 默認為0,不以秒計 Date date = calendar.getTime();long time=24*60*60*1000;//24個小時Timer timer= new Timer();TaskMethod taskMethod=new TaskMethod();;timer.schedule(taskMethod, date, time);// 在凌晨24點零分零秒后執行此任務,每次間隔24小時}*/Timer timer= new Timer();TaskMethod taskMethod=new TaskMethod();;public void contextInitialized(ServletContextEvent sce) {Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.HOUR_OF_DAY, 24); // 24點 可以更改時間 calendar.set(Calendar.MINUTE, 0); // 0秒 可以更改分數 calendar.set(Calendar.SECOND, 0);// 0 默認為0,不以秒計 Date date = calendar.getTime();long time=24*60*60*1000;//24個小時timer.schedule(taskMethod, date, time);//在凌晨24點零分零秒后執行此任務,每次間隔24小時// 第一種方法:指定任務task在指定時間time執行//schedule(TimerTask task, Date time)// 第二種方法:指定任務task在指定延遲delay后執行//schedule(TimerTask task, long delay) // 第三種方法:指定任務task在指定時間firstTime執行后,進行重復固定延遲頻率peroid的執行 // schedule(TimerTask task, Date firstTime,long period) // 第四種方法:指定任務task 在指定延遲delay 后,進行重復固定延遲頻率peroid的執行 // schedule(TimerTask task, long delay, long period) // 第五種方法:指定任務task在指定時間firstTime執行后,進行重復固定延遲頻率peroid的執行 // scheduleAtFixedRate(TimerTask task,Date firstTime,long period) // 第六種方法:指定任務task 在指定延遲delay 后,進行重復固定延遲頻率peroid的執行 // scheduleAtFixedRate(TimerTask task, long delay, long period)}@Overridepublic void contextDestroyed(ServletContextEvent sce) {timer.cancel();} }三、TaskMethod
package com.cgb.tspsystem.utils;import java.text.SimpleDateFormat; import java.util.Date; import java.util.TimerTask;import javax.servlet.ServletContext;public class TaskMethod extends TimerTask{public void run() {EndMethod em=new EndMethod();/*Date dt = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH時mm分ss秒"); System.out.println("定時執行:"+sdf.format(dt));*/em.run(); } }四、EndMethod
我們在應用場景中會遇到每一個任務的執行時間都不相同,并且每一個任務只執行一次,如果按照上面的做法,就是每次生成一個TimerTask放到Timer中執行,這樣太耗費資源了,我們需要實現一個線程來監聽所有的任務。
package com.cgb.tspsystem.utils;import com.cgb.core.persistent.Constants; import com.cgb.core.persistent.DataManager; import com.cgb.core.persistent.db.DBDataModel;public class EndMethod implements Runnable{@Overridepublic void run() {System.out.println("運政系統從業人員滿六十周歲自動注銷資格證-->開始"); update();}DBDataModel dm = new DBDataModel();public void update() {dm.clear();String sql = "UPDATE (SELECT * FROM TB_EMP_CERTIFIC t LEFT JOIN TB_EMP_PERSON p ON t.V_VCH_PERSON_ID=p.V_VCH_PERSON_ID WHERE p.V_VCH_NAME ='王文義' AND p.V_DTM_BIRTHDAY < add_months(sysdate,-720)) A SET A.V_CHR_CERTIFIC_STATE='S'";dm.setMode(Constants.MODE_UPDATE);dm.setSQL(sql);DataManager.getHandler(dm).executeUpdate(dm);System.out.println(dm.getMode());System.out.println("注銷完成!");} }?
總結
以上是生活随笔為你收集整理的JDK自带的Timer定时器实现每天24点修改数据的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: SAP物料主数据修改利润中心
- 下一篇: SwitchyOmega情景模式
