作爲構建優惠券系統的任務的一部分 我正在構建一個用於構建支持優惠券系統數據庫的Java程序的任務。 我應該創建一個線程,在每天的開始(00:00:00或稍後)運行一項任務,該任務檢查數據庫中的哪些優惠券已過期並將其從數據庫中刪除。爲此,我不能使用實現調度程序和定時器的java庫和包。 我正在努力尋找一種方法來確保任務在需要的特定時間每天運行。強制線程在特定時間每天執行操作
這裏是我想出了到現在爲止(它只會在24周小時的間隔工作):提前
public class DailyCouponExpirationTask extends Thread {
// class fields
private boolean keepRunning;
private final long sleepTime;
private CompanyDBDAO companyDBDAO;
private CouponDBDAO couponDBDAO;
private CustomerDBDAO customerDBDAO;
// constructor
DailyCouponExpirationTask() {
keepRunning = true;
this.sleepTime = 24 * 60 * 60 * 1000;
companyDBDAO = new CompanyDBDAO();
couponDBDAO = new CouponDBDAO();
customerDBDAO = new CustomerDBDAO();
} // end constructor
// class methods
// force the thread to stop
void stopRunning() {
keepRunning = false;
interrupt();
} // end method stopRunning
// Runnable interface methods
// run
@Override
public void run() {
while (keepRunning) {
Date currentDate = new Date(new java.util.Date().getTime());
Collection<Coupon> coupons = couponDBDAO.getAllCoupons();
Iterator<Coupon> iterator = coupons.iterator();
while (iterator.hasNext()) {
Coupon currentCoupon = iterator.next();
if (currentDate.after(currentCoupon.getEndDate())) {
// remove coupon from database
}
}
try {
Thread.sleep(sleepTime);
} catch (InterruptedException e) {
if (keepRunning) {
e.printStackTrace();
}
}
}
} // end method run
} // end class DailyCouponExpirationTask
謝謝!
編輯:我想出了一個解決方案,我想聽聽你的想法和評論。 心中已經創建計算Thread
的總睡眠時間,直到下一次例行任務迭代的方法:
// calculate sleep time until next coupons update task (1:00:00 next day)
private long calculateSleepTime() {
Calendar currentTime = new GregorianCalendar();
Calendar nextUpdateTime = new GregorianCalendar();
nextUpdateTime.set(Calendar.HOUR_OF_DAY, 1);
nextUpdateTime.set(Calendar.MINUTE, 0);
nextUpdateTime.set(Calendar.SECOND, 0);
nextUpdateTime.set(Calendar.MILLISECOND, 0);
nextUpdateTime.add(Calendar.DAY_OF_MONTH, 1);
return nextUpdateTime.getTimeInMillis() - currentTime.getTimeInMillis();
} // end method calculateSleepTime
您可以使用Spring批處理來執行此操作 – Lathy
爲什麼cronTab或WindowsService(取決於O.S)不適用於您? –
@MrunalGosar 其實這是我給的任務。它應該在一天內運行一次,但我認爲如果它在用戶登錄系統之前的每天開始的夜間運行會更好。對於作業,我不應該使用外部庫,所以我試圖弄清楚是否可以使用基本的Java來完成。 –