2015-05-20 24 views
18

Ho visto l'esempio Spring Boot per le attività di pianificazione (https://spring.io/guides/gs/scheduling-tasks/) e la lettura di alcuni documenti (https://javahunter.wordpress.com/2011/05/05/cronscheduler-in-spring/) e vedo che * e? sono usati quasi in modo intercambiabile.Differenza tra * e? in Spring @Scheduled (cron = ".....")

Ad esempio, la linea di

@Scheduled(cron = "0 15 10 ? * *") 

e

@Scheduled(cron = "0 15 10 * * ?") 

fare la stessa identica cosa. Quindi qual è la differenza tra * e?

risposta

3

asterix sta per tutti i valori possibili. i punti interrogativi devono essere utilizzati per un valore non specifico

* ("tutti i valori"): utilizzato per selezionare tutti i valori all'interno di un campo. Ad esempio, "" nel campo minuto significa * "ogni minuto".

? ("nessun valore specifico") - utile quando è necessario specificare qualcosa in uno dei due campi in cui è consentito il carattere, ma non l'altro . Ad esempio, se desidero attivare il trigger su un giorno specifico del mese (ad esempio il decimo), ma non mi interessa quale giorno della settimana è lo , metterei "10" nel giorno di-mese, e "?" nel campo il giorno della settimana. Vedere gli esempi di seguito per chiarimenti.

copiati dal tutorial

+0

Siamo spiacenti, ma no :(. '?' È ** esattamente ** uguale a '*' https://stackoverflow.com/questions/30341067/difference-between-and-in-spring-scheduledcron/30789834 # 30789834 – Luchostein

+0

Perché questo è il modo in cui è implementato :(. Triste, ma vero: https://stackoverflow.com/questions/30341067/difference-between-and-in-spring-scheduledcron/30341102 – Luchostein

+0

@Luchostein è lo stesso per implenetation, ma in caso di documentazione è diverso – Jens

19

Il tutorial è obsoleto. Il simbolo ? significa esattamente uguale a *. A partire dalla primavera 3.1.2.RELEASE, la gerarchia di richiamo è:

Il costruttore CronTrigger(String) chiama il costruttore CronSequenceGenerator(String) che chiama parse(String) che chiama setDays(BitSet bits, String field, int max). La sua attuazione è chiaro:

private void setDays(BitSet bits, String field, int max) { 
    if (field.contains("?")) { 
     field = "*"; 
    } 
    setNumberHits(bits, field, 0, max); 
} 

Quindi, se ?, quindi *.

+0

Sei sicuro? '?' è ancora menzionato nella documentazione http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/scheduling/support/CronSequenceGenerator.html – user1766169

+0

Questo è esattamente il problema. La documentazione dice così, ma il codice no. – Luchostein

+1

Non è davvero un bug, l'implementazione di trattare con * e? sono uguali, ma in termini di intento di configurazione sono leggermente diversi. –