Esiste un'implementazione simile a cron di ScheduledExecutorService in Java?
Domanda
ScheduledExecutorService in Java è abbastanza utile per ripetere attività con intervalli fissi o ritardo fisso. Mi chiedevo se esiste qualcosa di simile al servizio ScheduledExecutor esistente che ti consente di specificare un'ora del giorno in cui pianificare l'attività, piuttosto che un intervallo, ad esempio "voglio che questa attività si attivi alle 10 ogni giorno".
So che puoi ottenerlo con Quartz, ma preferirei non utilizzare quella libreria se possibile (è un'ottima libreria ma preferirei non avere la dipendenza per alcuni motivi).
Altri suggerimenti
Sono state apportate ulteriori ricerche CronExecutorService in HA-JDBC. È interessante notare che ha una dipendenza da Quartz per il suo CronExpression classe, ma il gioco è fatto. Non è poi così male.
Aggiornamento: ho corretto i collegamenti interrotti in modo da puntare a nuove versioni, ma non so più se questa è l'unica dipendenza
ThreadPoolTaskScheduler, può essere utilizzato ogni volta che la gestione di thread esterni non è un requisito. Internamente, delega a un'istanza ScheduledExecutorService . ThreadPoolTaskScheduler implementa anche l'interfaccia TaskExecutor di Spring, in modo che una singola istanza possa essere utilizzata per l'esecuzione asincrona, nonché per esecuzioni pianificate e potenzialmente ricorrenti.
Dove CronTrigger () contiene cronExpression http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/scheduling/support/CronSequenceGenerator.html
Per ulteriori informazioni su questa soluzione, consultare Documenti di primavera: https://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.support.CronTrigger;
import java.util.Date;
public class CronTriggerSpringTest{
public static void main(String args[]){
String cronExpression = "0/5 * * * * *";
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.initialize();
scheduler.schedule(new Runnable() {
@Override
public void run() {
System.out.println("Hello Date:"+new Date());
}
}, new CronTrigger(cronExpression));
}
}
Quando si utilizza scheduleAtFixedRate si fornisce un ritardo. Quindi il ritardo può essere la differenza alle 10 del mattino e il periodo è di 24 ore. Ciò potrebbe spostarsi un po ', anche con un timer, quindi quello che puoi fare è pianificare un'attività che si aggiunge a ScheduledExecutorService con un ritardo adeguato ogni volta.