1. 程式人生 > >Java定時器(實現每月1號、每日、每15分鐘自動執行任務)

Java定時器(實現每月1號、每日、每15分鐘自動執行任務)

需求:在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即可自動執行。