Java定時器(實現每月1號、每日、每15分鐘自動執行任務)
阿新 • • 發佈:2019-02-03
需求:在tomcat中,每月一號、每日、每分鐘自動執行指定的任務。
開發環境: java + tomcat
實現思路:在tomcat中,新增監聽器,在監聽器中設定定時任務。
1.監聽:
新建監聽:新建類,implents ServletContextListener 即可:
講解:
1.1建立一個基準時間(每日8點),用於參照。在此時間以後的多長週期內執行操作。
1.2 schedule(task, firstTime, period); 方法引數:
task:TimerTask任務,用內部匿名類的方式新建一個即可(當然也可以在外部類中建一個類,用於寫任務,寫法麻煩點),實現run()方法,在Run中寫你要執行操作即可。
firstTime:放建好的基準時間
period:執行週期,單位:毫秒。一天寫法:24 * 60 * 60 * 1000
1.3 : 如何判斷是每月1號?用Calendar的Calendar.DAY_OF_MONTH,每月首天 返回值為1。每天都執行下判斷,到每月一號時,即可實現每月執行一次
Web監聽器程式碼如下:
1.4
package com.today.ems.listener; import java.util.Calendar; import java.util.Date; import java.util.Timer; import java.util.TimerTask; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import org.apache.log4j.Logger; import com.today.ems.client.TemsWsClient; public class SendWsListener implements ServletContextListener { private final static Logger logger = Logger.getLogger(SendWsListener.class); @Override public void contextDestroyed(ServletContextEvent arg0) { logger.debug("定時傳送Xml資訊監聽--已關閉!"); } @Override public void contextInitialized(ServletContextEvent arg0) { // 指定的任務,從指定的延遲後,開始進行重複執行。 Calendar calendar = Calendar.getInstance(); int year = calendar.get(Calendar.YEAR); int month = calendar.get(Calendar.MONTH); int day = calendar.get(Calendar.DAY_OF_MONTH); /** * 定製每天的8:00:00執行,若程式已超過8點啟動,當天不再執行,等到明日八點再執行 * 這樣保證了時間一直是8點,而不會變成程式啟動時間 */ calendar.set(year, month, day, 8, 00, 00); Date defaultdate = calendar.getTime();// 今天8點(預設傳送時間) Date sendDate = new Date(); // 8點後開機 if (defaultdate.before(new Date())) { // 將傳送時間設為明天8點 calendar.add(Calendar.DATE, 1); sendDate = calendar.getTime(); } /** * ----------------每刻任務 ---------------- * 啟動伺服器後,若此時時間沒過8點,等待。到了8點自動執行一次,15分鐘後再執行一次,周而復始 * 啟動伺服器後,若此時時間超過8點,會立刻執行一次,等到15分鐘後再次執行一次,周而復始 * 到了第二天,不會再判斷是否是8點,這個開始時間,只會判斷一次而已 */ Timer qTimer = new Timer(); qTimer.schedule(new TimerTask() { @Override public void run() { logger.info("每刻任務已執行"); TemsWsClient client = new TemsWsClient(); client.sendXmlData(client.getBeanIdsNow()); } }, defaultdate, 15 * 60 * 1000);// 定時每15分鐘 logger.debug("每刻定時傳送Xml資訊監聽--已啟動!"); /** * ----------------每日任務 ---------------- * 啟動伺服器後,若此時時間沒過8點,等待。到了8點自動執行一次,24小時後(第二天8點)再執行一次,周而復始 * 啟動伺服器後,若此時時間已經超過8點,會立刻執行一次,等到24小時後(第二天8點)再次執行一次,周而復始 */ Timer dTimer = new Timer(); dTimer.schedule(new TimerTask() { @Override public void run() { logger.info("每日任務已經執行"); TemsWsClient client = new TemsWsClient(); client.sendXmlData(client.getBeanIdsDay()); } }, sendDate, 24 * 60 * 60 * 1000);// 定時24小時:24 * 60 * 60 * 1000 logger.debug("每日定時傳送Xml資訊監聽--已啟動!"); /** * ----------------每月任務 ---------------- * 啟動伺服器後,若此時時間沒過8點,等待。到了8點自動執行判斷是否是當前月份的1號,若是則執行一次, * 24小時後(第二天8點)再執行一次判斷(每月1號以後後的29天或30天后才會是下月1號,再執行一次),周而復始 * 啟動伺服器後,若此時時間已經超過8點,會立刻執行一次,等到下個月1號再次執行一次,周而復始 */ Timer mTimer = new Timer(); mTimer.schedule(new TimerTask() { @Override public void run() { Calendar c = Calendar.getInstance(); int day = c.get(Calendar.DAY_OF_MONTH); logger.info("月任務 判斷中"); if (day == 1) { // 每天執行,若為每月1號才執行 logger.info("月任務執行已執行"); TemsWsClient client = new TemsWsClient(); client.sendXmlData(client.getBeanIdsMon()); } } }, sendDate, 24 * 60 * 60 * 1000);// 每天執行一次檢查 logger.debug("每月定時傳送Xml資訊監聽--已啟動!"); } }
2.在web.xml中設定監聽檔案:
<web-app>
<listener>
<listener-class>com.today.ems.listener.SendWsListener</listener-class>
</listener>
</web-app>
3.重新部署專案,啟動tomcat即可自動執行。