2017-07-18 2 views
1

Ich möchte ein Cron in Java, die jede 'x' Stunden täglich ausgeführt werden. X wird durch einen Wert in der Datenbank entschieden, der nicht statisch ist. Ich habe versucht, so etwas wie dieses:Ausdruck in einem cron

private static String cronRunTime = getCronRunTimeFromDb(); 
private String cronExpression = "* " + cronRunTime + " * * *"; 

Aber das Hauptproblem ich bin vor, das ich nicht bin immer wie kann ich diesen Wert in der @Scheduled Anmerkung konfigurieren.

Ich habe versucht, etwas:

@Scheduled(cron = cronExpression) 
    public void myCron(){ 

    } 

Aber ich einen Fehler bei der Kompilierung bekommen:

error: element value must be a constant expression 
    @Scheduled(cron = cronExpression) 

Kann bei der Lösung dieses Problems helfen mir bitte jemand.

+0

Ist Ihre Frage "Warum bekomme ich einen Compilerfehler?" oder es geht eher um "wie konfiguriere ich Cron-Ausdruck geplante Aufgabe basierend auf Informationen aus der Datenbank?" –

+0

meine Frage ist "Wie konfiguriere ich Cron-Ausdruck geplanten Task basierend auf Informationen aus der Datenbank" –

+0

Ich habe 2 Optionen in meiner Antwort unten: Java-Code und konfigurieren Sie Aufgabe programmgesteuert (mit Spring), und deklarative Weise mit '@ Scheduled Annotation und Platzhalterfunktionen von Spring. Sie können auch die Spring-Methode löschen und einfach reine JDK-Funktionen verwenden, um geplante Tasks auszuführen: 'ExecutorService' usw. –

Antwort

0

"s min Stunde Tag Monat Wochentag"

"0 0 *? * *" Ist der Cron-Ausdruck für jede Stunde jeden Tag.
"0 0 10? * *" Ist der Cron-Ausdruck für 10 Uhr jeden Tag.

Was Sie für mit allen "x" Stunden suchen jeden Tag wäre:

"? 0 0 */x * *"

Hoffnung, das hilft.

1

Laut Java specification müssen die Werte der Annotationselemente für primitive Typen und Stringconstant expressions sein - etwas, das zur Kompilierzeit ausgewertet werden kann, nicht zur Laufzeit.

Kurz gesagt: Sie können nicht auf eine Anmerkung übergeben Sie den Wert Attribut, das zur Laufzeit ausgewertet wird (wird aus Datenbank, von Immobilien-Datei zu lesen, oder auch aus einer statischen Funktion wie System.currentTimeMillis() zurückgegeben)

Wenn Sie eine dynamische haben Logik für Ihre geplante Aufgabe, die von einer Art von Konfiguration (in Datenbank oder Eigenschaftendatei) abhängt, sollten Sie ScheduledTaskRegistrar und seine addCronTask(CronTask task) Methode verwenden, die natürlich nicht so ordentlich wie einfache Anmerkung ist.

Siehe Beispiel dafür, wie ScheduledTaskRegistrar unter Antworten verwenden hier:

Als Alternative Sie eine Eigenschaft Platzhalter Logik verwenden kann cron Attribut @Scheduled Anmerkung zu füllen, wie es bereits beschrieben in anderen Fragen:

Sie können sogar Frühling machen Eigenschaften aus der Datenbank zu lesen, wenn Sie wirklich gonna go wild, siehe:

Verwandte Themen