我想在特定時間安排某個特定日期的任務。每次運行之間的時間間隔可以設置爲1到12個月。在java中,可以使用ScheduledExecutorService以固定的時間間隔調度任務。由於一個月的天數不固定,如何實現?使用ScheduledExecutorService計劃每月任務
在此先感謝。
我想在特定時間安排某個特定日期的任務。每次運行之間的時間間隔可以設置爲1到12個月。在java中,可以使用ScheduledExecutorService以固定的時間間隔調度任務。由於一個月的天數不固定,如何實現?使用ScheduledExecutorService計劃每月任務
在此先感謝。
如果您在Java EE環境中運行的是,你應該使用TimerService或@Schedule註解。但是由於您正在討論ScheduledExecutorService,在Java EE容器中不允許使用它們,我假設您沒有運行在一個Java EE容器中。
當使用ScheduledExecutorService的,你可以有任務本身安排下一次迭代:早於8
final ScheduledExecutorService executor = /* ... */ ;
Runnable task = new Runnable() {
@Override
public void run() {
ZonedDateTime now = ZonedDateTime.now();
long delay = now.until(now.plusMonths(1), ChronoUnit.MILLIS);
try {
// ...
} finally {
executor.schedule(this, delay, TimeUnit.MILLISECONDS);
}
}
};
int dayOfMonth = 5;
ZonedDateTime dateTime = ZonedDateTime.now();
if (dateTime.getDayOfMonth() >= dayOfMonth) {
dateTime = dateTime.plusMonths(1);
}
dateTime = dateTime.withDayOfMonth(dayOfMonth);
executor.schedule(task,
ZonedDateTime.now().until(dateTime, ChronoUnit.MILLIS),
TimeUnit.MILLISECONDS);
在Java版本中,您可以使用日曆做同樣的事情:
final ScheduledExecutorService executor = /* ... */ ;
Runnable task = new Runnable() {
@Override
public void run() {
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.MONTH, 1);
long delay =
calendar.getTimeInMillis() - System.currentTimeMillis();
try {
// ...
} finally {
executor.schedule(this, delay, TimeUnit.MILLISECONDS);
}
}
};
int dayOfMonth = 5;
Calendar calendar = Calendar.getInstance();
if (calendar.get(Calendar.DAY_OF_MONTH) >= dayOfMonth) {
calendar.add(Calendar.MONTH, 1);
}
calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
executor.schedule(task,
calendar.getTimeInMillis() - System.currentTimeMillis(),
TimeUnit.MILLISECONDS);
既然你想要一段時間執行一次的東西,你需要一些可靠的東西。
看看石英:
http://www.quartz-scheduler.org/documentation/quartz-2.x/cookbook/MonthlyTrigger.html