1. 程式人生 > >Timer定時器如何在時間範圍內執行?

Timer定時器如何在時間範圍內執行?

       我們知道,Timer定時器是不支援時間範圍內的執行,但是需求中有這樣的情景,我們有一個預約扣款的需求,扣款成功後就會發簡訊,但是我們也不知道什麼時候扣款成功,有時候半夜凌晨就會扣款成功,我們扣款成功判斷這裡用Timer定時器掃描的,每隔一段時間執行一次,但是半夜凌晨不希望扣款後發簡訊,以免打擾使用者休息,要選擇白天發簡訊,請看如下程式碼!

//從配置檔案中讀取時間.
public Map<String, Object> getTime(Properties properties){
		Map<String, Object> map=new HashMap<String, Object>();
        Integer hour= Integer.valueOf(properties.get("hour").toString()) ;
        Integer min= Integer.valueOf(properties.get("min").toString()) ;
        Integer second= Integer.valueOf(properties.get("second").toString()) ;
        Integer frequency= Integer.valueOf(properties.get("frequency").toString()) ;
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, hour); // 控制時
        calendar.set(Calendar.MINUTE, min);       // 控制分
        calendar.set(Calendar.SECOND, second);       // 控制秒
        Date time = calendar.getTime();         // 得出執行任務的時間,此處為今天的00:00:00
        map.put("time", time);
        map.put("frequency", 1000 * 60 * 60 *frequency);//1000 * 60 * 60 *frequency
        return map;
}

 

	/**
	 * 執行條件
	 * @param time 配置檔案起始時間
	 * @param endHour 結束時間
	 * @return
	 */
private boolean excCondition(Date time,int endHour){
		boolean f=false;
		SimpleDateFormat sdf=new SimpleDateFormat("HH");
        String date=sdf.format(time);
        Date c=new Date();
        String curentString=sdf.format(c);
        int curent=Integer.valueOf(curentString);
        int start=Integer.valueOf(date);
        int end =endHour;
        if(curent>=start && curent<=end){
        	f= true;
        }
        return f;
	}

	//定時期執行
public void start(Properties properties) throws Exception {
		final int endHour=Integer.valueOf(properties.getProperty("end"));
		Map<String,Object> map=getTime(properties);
		final Date time=(Date)map.get("time");
		Integer frequency=(Integer) map.get("frequency");
		Timer timer = new Timer();
		timer.scheduleAtFixedRate(new TimerTask() {
			public void run() {
				// 處理方法
				if(excCondition(time,endHour)){
					logger.info("開始啟動....");
                                    //業務程式碼執行
					BuyAction action = new BuyAction();
					action.execute();
					logger.info("執行完畢....");
				}
			}
		}, time, frequency);

	}