java監聽器+quartz實現每天動態時間執行任務的功能

最近工作遇到一個需求:每天都要在某個時間執行一個任務 這個時間是 動態的 從數據庫取的
比如今天是要在22點45分15秒執行一個任務 明天的這個時間是  23點45分11秒 以此類推 每天都會有一個動態的時間任務


網上找了很多資料 看了很多博客 ,此時深深感到國內it技術界的醜惡,好多博客都寫的殘全不全,浪費了我一天多的時間一直網上看資料 下demo跑起來都不是我想要的,經過思考終於解決這個需求,就是通過監聽器實現每天固定時間的週期任務,然後通過quartz實現在指定的時間執行業務邏輯

核心代碼:
package com.task;

import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

import org.quartz.CronExpression;
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.impl.StdSchedulerFactory;

import com.db.DBUtil;
import com.quartz.CountJob;
import com.util.CommonUtil;

public class TestTimer {
	static int count = 0;

	public static void showTimer() throws ClassNotFoundException, SQLException,
			ParseException {
		TimerTask task = new TimerTask() {
			@Override
			public void run() {
				++count;

				System.out.println("時間=" + new Date() + " 執行了" + count + "次"); // 1次
				// System.out.println("這裏做業務邏輯");

				String times = "";
				try {
					times = DBUtil.getTimes();  //這個值就是數據庫取的 很簡單的取一個表 你們自己可以在本地建一個表來做測試 當然每天都會有不同的值 通過另外的項目生成 爲了測試 我是自己手動改的數據庫值 你們也可以這麼做 如果只是想看效果的話
					System.out.println("下次任務時間:" + times);
				} catch (ClassNotFoundException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				} catch (SQLException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}

				Scheduler scheduler = null;
				try {
					scheduler = StdSchedulerFactory.getDefaultScheduler();
				} catch (SchedulerException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				try {
					scheduler.start();
				} catch (SchedulerException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

				if (count >= 2) {
					System.out.println("說明這裏是第二次以上的的定時任務:"+count);
					try {
						scheduler.shutdown();	//關閉之前的調度任務
					} catch (SchedulerException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}  
					
					//重新開啓任務
					try {
						scheduler = StdSchedulerFactory.getDefaultScheduler();
					} catch (SchedulerException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					try {
						scheduler.start();
					} catch (SchedulerException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					
					//開啓新的調度任務
					JobDetail jd = new JobDetail("test"+count, "test_group"+count,
							CountJob.class);
					CronTrigger ct = new CronTrigger("test"+count, "test_group"+count);
					// 你修改下面的 表達式 就能滿足了
					// 時間格式: <!-- s m h d m w(?) y(?) -->, 分別對應: 秒>分>小時>日>月>周>年
					try {
						// SimpleDateFormat sdf = new
						// SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
						// Date date = sdf.parse(times);
						SimpleDateFormat sdf = new SimpleDateFormat(
								"yyyy-MM-dd HH:mm:ss");
						Date dateSFM = sdf.parse(times);
						Calendar calendarSFM = Calendar.getInstance();
						calendarSFM.setTime(dateSFM);
						// System.out.println("時:"+calendar.get(Calendar.HOUR_OF_DAY)+"分:"+calendar.get(Calendar.MINUTE)
						// +"秒:"+calendar.get(Calendar.SECOND));
						String cron = CommonUtil.makeDailyTriggerCron(
								calendarSFM.get(Calendar.HOUR_OF_DAY),
								calendarSFM.get(Calendar.MINUTE),
								calendarSFM.get(Calendar.SECOND));
						ct.setCronExpression(cron);
					} catch (ParseException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					try {
						scheduler.scheduleJob(jd, ct);
					} catch (SchedulerException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				} else {
					JobDetail jd = new JobDetail("test", "test_group",
							CountJob.class);
					CronTrigger ct = new CronTrigger("test", "test_group");
					// 你修改下面的 表達式 就能滿足了
					// 時間格式: <!-- s m h d m w(?) y(?) -->, 分別對應: 秒>分>小時>日>月>周>年
					try {
						// SimpleDateFormat sdf = new
						// SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
						// Date date = sdf.parse(times);
						SimpleDateFormat sdf = new SimpleDateFormat(
								"yyyy-MM-dd HH:mm:ss");
						Date dateSFM = sdf.parse(times);
						Calendar calendarSFM = Calendar.getInstance();
						calendarSFM.setTime(dateSFM);
						// System.out.println("時:"+calendar.get(Calendar.HOUR_OF_DAY)+"分:"+calendar.get(Calendar.MINUTE)
						// +"秒:"+calendar.get(Calendar.SECOND));
						String cron = CommonUtil.makeDailyTriggerCron(
								calendarSFM.get(Calendar.HOUR_OF_DAY),
								calendarSFM.get(Calendar.MINUTE),
								calendarSFM.get(Calendar.SECOND));
						ct.setCronExpression(cron);
					} catch (ParseException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					try {
						scheduler.scheduleJob(jd, ct);
					} catch (SchedulerException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}

			}
		};

		// long delayTime = 24 * 60 * 60 * 1000; // 每24個小時執行一次
		long delayTime = 3 * 60 * 1000; // 每分鐘執行一次

		Calendar calendar = Calendar.getInstance();
		int year = calendar.get(Calendar.YEAR);
		int month = calendar.get(Calendar.MONTH);
		int day = calendar.get(Calendar.DAY_OF_MONTH);// 每天

		calendar.set(year, month, day, 19, 35, 30); // 每天中午12點執行
		// calendar.set(year, month, day, calendar.get(Calendar.HOUR_OF_DAY),
		// calendar.get(Calendar.MINUTE), calendar.get(Calendar.SECOND));
		Date date = calendar.getTime();
		Timer timer = new Timer();
		System.out.println(date);

		// int period = 2 * 1000;
		// 每天的date時刻執行task,每隔2秒重複執行
		// timer.schedule(task, date, period);
		// 每天的date時刻執行task, 僅執行一次
		timer.schedule(task, date, delayTime);

	}

	}




package com.quartz;
import java.util.Date;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class CountJob implements Job
{

    public void execute(JobExecutionContext arg0) throws JobExecutionException
    {
        System.out.println("我就是具體業務任務啊 ,看到我說明任務執行了!"+ new Date());
        
    }

}


爲了看測試效果 我設置的監聽器是每3分鐘執行一次 生產中只要改成每天就好了



e4784595-25eb-3021-b1d3-bb8a7d92a8af.png
這是測試效果

demo 代碼 完整項目我已經放到附件中 供大家下載
  • e4784595-25eb-3021-b1d3-bb8a7d92a8af-thumb.png
  • 大小: 42.7 KB
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章