Scheduling: "Quartz" verwenden, Hilfe bei Umstellung

internet

Top Contributor
Hallo zusammen,

ich nutze derzeit die Mittel von JAVA EE / Jakarta EE für das Scheduling.
Ich sehe aber mit Quartz hat man dennoch mehr Möglichkeiten, auch renne die derzeit in Transaction - Probleme, die eventuell mit Quartz Geschichte sind.

Aktuell habe ich bereits eine Datenbank - Tabelle, die mir den Status des Schedules, geplantes Ausführungsdatum etc. speichert.
Daher benötige ich nicht die Option eine weitere DB - Tabelle für Quartz zu erstellen.

Derzeit habe ich ein Java EE Schedule, der jede Minute läuft und eine Datenbank - Abfrage macht, ob es ausstehende Schedules gibt.

Nun wäre meine Idee „Quartz“ zu nutzen.
Meine Idee ist nun:
  • Beim Hochfahren des Servers per Quartz alle Schedules erstellen, die aus der Tabelle „Schedule“ ausstehend und eingeplant sind.
  • Den Java EE Schedule, der aktuell jede Minute läuft und prüft, ob es ausstehende Schedules gibt, kann ich mir damit sparen.

Nun habe ich folgende Fragen:

  • Passt der Switch zu Quartz mit dem aktuellen Konzept / Setup?
  • Inwiefern muss der Code geändert werden um auf Quartz umzustellen? Hat hier vielleicht jemand Erfahrungen?
    • Vielleicht hat jemand ein einfaches Beispiel für den Schedule und dann die Ausführung?
  • Benötige ich dann ebenfalls, denn dies benötige ich wohl für Apache Shiro
  • Java:
    Runnable myRunnable = new Runnable() {
                    @Override
                    public void run() {
                        try {
                              .....

Hier der Code, den ich aktuell verwende für Java EE:

Code:
@Singleton
@LocalBean
@Startup
public class Scheduler {

@PostConstruct
    public void init() {
        // Check outstanding Schedules...
        
          startSchedule();
     }
    
     /**
     * Create Schedule
     *
     * @throws Exception
     */
    public void startSchedule() {

            ScheduleExpression scheduleExpression = new ScheduleExpression();
            scheduleExpression.minute("*/1").hour("*");

            TimerConfig timerConfig = new TimerConfig();
            timerConfig.setPersistent(false);

            timerService.createCalendarTimer(scheduleExpression, timerConfig);

            execute();
    }
    
    @Timeout
    @AccessTimeout(value = 20, unit = TimeUnit.MINUTES)
    public void execute() throws Exception {

            // Globale Einstellungen laden und prüfen, ob der ScheduleService aktiv ist
            Object objectScheduleActive = applicationSettingsStoredBean
                    .findValue(ApplicationSettingConstants.SCHEDULE_ACTIVE);

            if (objectScheduleActive == null)
                return;

            scheduleIsActive = (boolean) objectScheduleActive;

            if (scheduleIsActive == false) {
                LOGGER.warn("Scheduler is currently not active...");
                return;
            }

            if (currentlyRunning) {
                LOGGER.warn("Scheduler is currently running...");
                return;
            }

            if (schedulingService == null)
                schedulingService = new SchedulingService();

            currentlyRunning = true;

            /**
             * Alle noch nicht ausgeführten Schedules bekommen
             */
            List<ScheduleExecution> scheduleExecutionList = scheduleExecutionService
                    .findAllScheduleExecutionOutstanding();

            if (scheduleExecutionList == null || scheduleExecutionList.size() == 0) {
                LOGGER.info("NO PLANNED SCHEDULES FOUND");
                currentlyRunning = false;
                return;
            }

            for (ScheduleExecution scheduleExecution : scheduleExecutionList) {

                // Hinzufügen zur Liste der Ausführungen
                addScheduleToList(scheduleExecution);
            }

            currentlyRunning = false;
        }
    }

    /**
     * Add Schedule to List
     *
     * @param scheduleExecution
     * @throws UnknownHostException
     */
    private void addScheduleToList(ScheduleExecution scheduleExecution) throws UnknownHostException {

        synchronized (this) {

            // generate a taskID and store them for further use
            String taskId = RandomStringUtils.randomAlphanumeric(20);
            scheduleExecution.setProcessId(taskId);

            // Dispatcher Name speichern
            String hostname = SessionInformationHelper.getHostName();
            scheduleExecution.setDispatcherName(hostname);

           // Apache Shiro
            Subject subject = permissionSystemUserServiceStoredBean.getSystemUser();

            Runnable myRunnable = new Runnable() {
                @Override
                public void run() {
                    try {

                        // Add tasks
                        executeAction(scheduleExecution);

                        ////// STATUS UPDATEN ///////
                        scheduleExecution.setEndExecutionDate(LocalDateTime.now());

                        // Uhrzeit berechnen
                        if (scheduleExecution.getStartExecutionDate() != null) {
                            Duration duration = Duration.between(scheduleExecution.getStartExecutionDate(),
                                    scheduleExecution.getEndExecutionDate());
                            scheduleExecution.setExecutionTimeMilliSeconds(duration.toMillis());
                            double milliToSecond = duration.toMillis();
                            scheduleExecution.setExecutionTimeSeconds(milliToSecond / 1000);
                        }

                        scheduleExecution.setStatus(ScheduleExecution.Status.DONE.toString());
                        scheduleExecutionService.updateScheduleExecution(scheduleExecution);

                        //// Hier werden die nächsten ScheduleExecution Termine festgelegt /////
                        createInterval(scheduleExecution);

                    } catch (Exception e) {

                        // IssueLog erstellen und Status auf Failed setzen
                        createIssueMessage(e, scheduleExecution);

                        //// Hier werden die nächsten ScheduleExecution Termine festgelegt /////
                        try {

                            // TODO, prüfen, ob die letzte Male erfolgreich gelaufen, wenn nein, dann
                            // Interval deaktivieren
                            createInterval(scheduleExecution);

                        } catch (Exception e2) {

                        }

                        // TODO ausstellen, damit nicht in LOG File
                        LOGGER.error(ExceptionUtils.getFullStackTrace(e));

                    }
                }
            };

            // Apache Shiro
            myRunnable = subject.associateWith(myRunnable);

            //////
            schedulingService.addTaskToExecutor(taskId, myRunnable, 0);
        }

    }

Danke für jede Hilfe
 

thecain

Top Contributor
Hast du wirklich Probleme mit JEE? Ich würde versuchen diese zu lösen. Ich sehe mit aktuellen JEE Versionen keinen Vorteil durch eine 3rd Party Lib wie Quartz.
 

internet

Top Contributor
Hast du wirklich Probleme mit JEE? Ich würde versuchen diese zu lösen. Ich sehe mit aktuellen JEE Versionen keinen Vorteil durch eine 3rd Party Lib wie Quartz.
Ich bin vor kurzem in ein Problem gerannt, bei dem wohl gleichzeitig mehrmals versucht wird ein Objekt in einem Thread zu aktualisieren in der Datenbank.... Ich habe leider die Fehlermeldung nicht mehr... Vllt. finde ich in den Logs noch was....

Bei Quartz kann man wohl auch einstellen, dass ein entsprechender Job auch nur 1x laufen darf.
Insgesamt scheint mir die Quartz API verständlicher zu sein...

Quartz scheint mir recht einfach zu sein...
Wie es mir scheint ist aber auch ein Scheduler, der jede Minute läuft Quatsch (Scheduler macht eine Abfrage gegen die DB und prüft, welche eingeplanten Schedules aus der DB noch nicht gelaufen sind).
Wäre es nicht besser, dass beim Hochfahren der Applikation initial eine Abfrage gegen die DB gemacht wird und einen Job (Schedule-Job) erstellt wird mit der entsprechenden Uhrzeit etc., anstatt jede Minute dies zu prüfen?

Man müsste dann eben nur sicherstellen, dass wenn man einen Schedule aus der DB ändert, dass die Änderung in dem Objekt von Quartz (Schedule-Job - Objekte) dann ebenfalls angepasst wird / gelöscht wird....

Gibt es hier Leute, die Quartz schon Mal verwendet haben?
 

Oneixee5

Top Contributor
Ich habe Quartz schon oft verwendet. Vermutlich verwendet JEE im Hintergrund, ja nach Implementierung, auch Quartz. Wenn ich deinen Text so lese frage ich mich aber, ob du überhaupt eine Vorstellung davon hast.
Du erstellst einen Job/Trigger usw., dieser wird geplant und zur geplanten Zeit ausgeführt - wenn du diese Variante verwendest. Wenn diese Planung einen Neustart überleben soll, dann musst du einfach den Vorgang persistent machen und nicht nur im Speicher halten. Quartz wird dann beim Neustart die unerledigten Jobs ausführen - falls das so eingestellt ist. Da muss man nichts nachschauen, alle 1 Minute usw.. Auch Kollisionen von Jobs kann man vermeiden. Die Möglichkeiten und Einstellungen sind so vielfältig, dass die Quartz-Leute eine Anleitung dafür erstellt haben. Man muss das aber auch lesen, nicht einfach irgendwas basteln!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Scheduling in JAVA EE Java Basics - Anfänger-Themen 14
A thread scheduling Java Basics - Anfänger-Themen 3
J Quartz Scheduler beispiele funktionieren nicht Java Basics - Anfänger-Themen 6
C Interface Parameter und Rückgabewerte in Lambda Ausdrücken verwenden Java Basics - Anfänger-Themen 16
R Operatoren Rechenoperation in Java verwenden für Calculator Java Basics - Anfänger-Themen 2
R Operatoren Rechenoperation verwenden für Taschenrechner. Java Basics - Anfänger-Themen 32
D next() Methode mehrfach verwenden Java Basics - Anfänger-Themen 1
N Kann man einen Iterator nur einmal verwenden Java Basics - Anfänger-Themen 5
B non-modular dependency in modularem Projekt verwenden Java Basics - Anfänger-Themen 3
A Ergebnis einer Methode bei einer anderen verwenden Java Basics - Anfänger-Themen 13
B Jar Dateien ohne IDE verwenden? Java Basics - Anfänger-Themen 1
N Exception beim Verwenden von Arraylist? Java Basics - Anfänger-Themen 10
Ameise04 Variablen Inhalt einer Variable im Code verwenden? Java Basics - Anfänger-Themen 9
P Objekt in mehreren Methoden verwenden. Java Basics - Anfänger-Themen 3
A Methode in einer anderen Klasse verwenden Java Basics - Anfänger-Themen 1
V Wachstum berechnen und in Ist-Formel verwenden Java Basics - Anfänger-Themen 5
M this.object in einer parameterlosen Methode verwenden Java Basics - Anfänger-Themen 3
S Klassen instanziieren und verwenden von Getter und Setter Java Basics - Anfänger-Themen 4
Torsten.E JavaFX mit Visual Studio Code verwenden Java Basics - Anfänger-Themen 1
S Verwenden von throw Exception an der Funktion Java Basics - Anfänger-Themen 2
K Boolean in einer erstellten Klasse verwenden Java Basics - Anfänger-Themen 14
J Methoden Methoden einer public class AutoCompleteTextField verwenden Java Basics - Anfänger-Themen 14
PaperHat Methoden als Parameter anderer Methode verwenden Java Basics - Anfänger-Themen 11
H Vererbung Static Scanner Objekt verwenden - von StdIn in einer importierten Klasse lesen Java Basics - Anfänger-Themen 10
E Sinn: final in Parameterliste verwenden Java Basics - Anfänger-Themen 2
M Klassen Warum sollte man Abstraktion verwenden? Java Basics - Anfänger-Themen 4
N Attribut einer anderen Klasse übertragen/verwenden Java Basics - Anfänger-Themen 5
M Probleme beim verwenden von Packages Java Basics - Anfänger-Themen 6
C Polymorphie Was genau ist Polymorphie und wann genau sollte man es verwenden? Java Basics - Anfänger-Themen 9
T Klassen Klasse in einer anderen Klasse verwenden. Java Basics - Anfänger-Themen 3
S Eingabe in anderer Klasse verwenden Java Basics - Anfänger-Themen 3
M Schleifenergebnis in selbiger wieder verwenden Java Basics - Anfänger-Themen 7
A OOP ArrayList verwenden Java Basics - Anfänger-Themen 3
M Erste Schritte Arraylist in einer anderen Klasse verwenden Java Basics - Anfänger-Themen 11
I BigDecimal als Parameter verwenden Java Basics - Anfänger-Themen 3
D ArrayList in einer anderen Klasse verwenden Java Basics - Anfänger-Themen 7
NightmareVirus überschriebene Methode der Oberklasse verwenden Java Basics - Anfänger-Themen 3
J Parameter in main verwenden Java Basics - Anfänger-Themen 3
M Eingabe des Benutzers Verwenden Java Basics - Anfänger-Themen 9
P Quadratzeichen verwenden Java Basics - Anfänger-Themen 7
C Variablen in Schleifen außerhalb verwenden Java Basics - Anfänger-Themen 2
H Methoden verwenden Java Basics - Anfänger-Themen 4
B Interface JTextField Eingabe als String verwenden Java Basics - Anfänger-Themen 3
OlafHD Variable aus einer anderen Klasse Verwenden Java Basics - Anfänger-Themen 11
K Dateien aus Source-Package verwenden Java Basics - Anfänger-Themen 10
N System Proxy verwenden Java Basics - Anfänger-Themen 0
J Erste Schritte Scanner negative zahl einlesen und verwenden. Java Basics - Anfänger-Themen 6
G Wie kann man den Erfolg einer Zuweisung als Boolean Wert verwenden? Java Basics - Anfänger-Themen 12
H jar datei verwenden Java Basics - Anfänger-Themen 1
J ArrayList über verschiedene Klassen verwenden Java Basics - Anfänger-Themen 7
C compareTo verwenden Java Basics - Anfänger-Themen 2
W IllegalArgumentException 2 mal verwenden Java Basics - Anfänger-Themen 3
S Variablen Vektor zur Berechnung verwenden Java Basics - Anfänger-Themen 4
L Dialogbox statt Konsole verwenden Java Basics - Anfänger-Themen 5
P JSON-Konfigurationsdatei verwenden: Probleme mit Pfad Java Basics - Anfänger-Themen 1
W Darf man den Übergabeparameter in einer Methode nicht verwenden? Java Basics - Anfänger-Themen 2
E Methode aus Klasse eins in Klasse zwei verwenden? Java Basics - Anfänger-Themen 2
E Datentypen Benutzerdefinierten Datentyp verwenden Java Basics - Anfänger-Themen 1
J Objekte zur Laufzeit erzeugen und direkt verwenden Java Basics - Anfänger-Themen 9
B Zahlen zerlegen und verwenden Java Basics - Anfänger-Themen 2
S Inhalt aus anderen Klassen verwenden Java Basics - Anfänger-Themen 1
I Rückgabewert einer Methode in anderer Klasse verwenden Java Basics - Anfänger-Themen 2
T Vererbung Variable aus anderer Klasse verwenden Java Basics - Anfänger-Themen 8
T File aus Classpath verwenden Java Basics - Anfänger-Themen 3
B Klassen Eigene "non static" Klasse in Main verwenden! Java Basics - Anfänger-Themen 12
T Array in andere Klasse verwenden Java Basics - Anfänger-Themen 3
K Von einem Double wert nur die Zahl vor dem Komma verwenden Java Basics - Anfänger-Themen 9
T Globale Variable mehrmals verwenden Java Basics - Anfänger-Themen 7
M Class Datein aus einen Unterordner verwenden Java Basics - Anfänger-Themen 2
B Objekt in mehereren Klassen verwenden Java Basics - Anfänger-Themen 4
L Erste Schritte Methode aus anderer Klasse verwenden Java Basics - Anfänger-Themen 16
M Wann final verwenden? Java Basics - Anfänger-Themen 5
M Wann eine Wrapper Klasse verwenden und wann einen primitiven Datentypen? Java Basics - Anfänger-Themen 8
G ArrayList in anderer Klasse verwenden Java Basics - Anfänger-Themen 31
D Erste Schritte Countdown mehrfach verwenden Java Basics - Anfänger-Themen 5
D Wert einer Variable in paint-Methode verwenden Java Basics - Anfänger-Themen 2
E wann welche Konstanten verwenden? Java Basics - Anfänger-Themen 7
K JTextField auslesen, in int umwandeln und in einer anderen Klasse als Zähler verwenden Java Basics - Anfänger-Themen 3
T return-Wert verwenden? Java Basics - Anfänger-Themen 12
I SwingUtilities.invokeLater - Wie verwenden für meinen Code? Java Basics - Anfänger-Themen 4
Y this verwenden oder nicht? Java Basics - Anfänger-Themen 23
O Absolute Pfade in mehrere Klassen verwenden Java Basics - Anfänger-Themen 3
D JTextField verwenden ohne Eingabe einer Variable Java Basics - Anfänger-Themen 4
R Switch Werte außerhalb verwenden Java Basics - Anfänger-Themen 2
L Objekte aus einem void in anderen voids verwenden Java Basics - Anfänger-Themen 8
MiMa Zip in util verwenden Java Basics - Anfänger-Themen 7
P Liste in einer Klasse füllen und mehreren anderen Klassen lesend verwenden Java Basics - Anfänger-Themen 5
K Mehrere Klassen beim JavaEditor verwenden - möglich? Java Basics - Anfänger-Themen 8
K Klassen Eigene Exception verwenden Java Basics - Anfänger-Themen 9
T Verwenden von Variablen aus anderen Klassen Java Basics - Anfänger-Themen 7
S Scanner -> Zahl lesen und weiter verwenden Java Basics - Anfänger-Themen 8
SexyPenny90 JLabel Text und Icon untereinander verwenden Java Basics - Anfänger-Themen 3
J eigene packages bzw klassen verwenden Java Basics - Anfänger-Themen 25
P Date oder Kalender? Was soll man verwenden? Java Basics - Anfänger-Themen 2
K Wann Vererbung und wann Interface verwenden? Java Basics - Anfänger-Themen 12
A Wenn genau welche Liste verwenden? Java Basics - Anfänger-Themen 6
X OOP Methoden und Variablen in anderer Klasse verwenden Java Basics - Anfänger-Themen 5
P Java Stream, wann welche Stream verwenden? Java Basics - Anfänger-Themen 3
M gleiche Box in GUI mehrmals verwenden Java Basics - Anfänger-Themen 5
L Erste Schritte Sollte ich hier lieber Cases verwenden oder wäre eine If-Bedingung besser? Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben