2016-08-18 1 views
0

Ich möchte eine Aufgabe an einem bestimmten Tag des Monats zu einer bestimmten Zeit planen. Das Intervall zwischen jedem Lauf kann zwischen 1 und 12 Monaten liegen. In Java können die Aufgaben in festgelegten Intervallen mithilfe von ScheduledExecutorService geplant werden. Da die Anzahl der Tage in einem Monat nicht festgelegt ist, wie kann dies erreicht werden?Monatliche Aufgabe planen mit ScheduledExecutorService

Vielen Dank im Voraus.

Antwort

1

Wenn Sie in einer Java EE-Umgebung laufen lassen, Sie TimerService oder die @Schedule Anmerkung verwenden sollten. Da Sie jedoch über den Task ScheduledExecutorService diskutieren, dessen Verwendung in einem Java EE-Container nicht zulässig ist, nehme ich an, dass Sie nicht in einem ausgeführt werden.

Wenn ein ScheduledExecutorService verwenden, können Sie die Aufgabe selbst die nächste Iteration planen haben:

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); 

In Versionen von Java früher als 8, können Sie einen Kalender verwenden können, das Gleiche zu tun:

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); 
Verwandte Themen