最近工做遇到一個需求:天天都要在某個時間執行一個任務 這個時間是 動態的 從數據庫取的
好比今天是要在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分鐘執行一次 生產中只要改爲天天就行了
這是測試效果 demo 代碼 完整項目我已經放到附件中 供你們下載