JavaFx: о кварцевом планировщике - PullRequest
0 голосов
/ 19 сентября 2019

Здравствуйте, у меня есть проблема в подпрограмме, использующей кварцевый планировщик. Мне нужно завершить мой метод Планировщика: останов javafx

Я не могу объявить свой планировщик из начала моей стадии:

@Override
    public void start(Stage stage) throws Exception {
        Scheduler s = StdSchedulerFactory.getDefaultScheduler();
        JobDetail j = JobBuilder.newJob(ChecarJob.class).build();
        Trigger t = TriggerBuilder.newTrigger().withIdentity("CroneTrigger")
                .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(60).repeatForever()).build();  
        try { 
        s.start();
        try {
            s.scheduleJob(j,t);
        } catch (Exception e) {
             e.printStackTrace();
        }      
        } catch (SchedulerException se) {
        se.printStackTrace();
        }
        Parent root = FXMLLoader.load(getClass().getResource("/fxml/Principal.fxml")); //carrega fxml
        Scene scene = new Scene(root); //coloca o fxml em uma cena
        stage.setScene(scene); // coloca a cena em uma janela
        stage.show(); //abre a janela
        setStage(stage);

    }

, и я должен объявить, что это было за пределами моего начала, чтобы иметь возможность использовать shutdown in stop ()

@Override
    public void stop() {
        UsuarioDAO u = new UsuarioDAO();
                    u.setOffiline();
                    s.shutdown();
                    Platform.exit();
                    System.exit(0);
    }

, если я сделаю это, я сделал выше, у меня ошибка, потому что мой планировщик был создан внутри методаи не является глобальным И планировщик не позволяет мне создавать его в глобальном масштабе по какой-то причине

мой код:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package views;

import dao.UsuarioDAO;
import dao.qtdRegistrosDAO;
import rotinas.BackupJob;
import rotinas.ChecarJob;
import java.io.IOException;
import java.net.ServerSocket;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.application.Platform;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javax.swing.JOptionPane;

import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;


/**
 * FXML Controller class
 *
 * @author SpiriT
 */
public class Principal extends Application {

    private static Stage stage; //uma janela
    private static qtdRegistrosDAO aQtdRegistrosDAO;
    public Principal() {
    }

    private void blockMultiInstance() {
        try {
            ServerSocket serverSocket = new ServerSocket(9581);
        } catch (IOException ex) {
            JOptionPane.showMessageDialog(null, "Software já está aberto!", "Atenção", JOptionPane.WARNING_MESSAGE);
            System.exit(0);
        }
    }


    private void backup (){
        try {
            Scheduler sx = StdSchedulerFactory.getDefaultScheduler();
            JobDetail jx = JobBuilder.newJob(BackupJob.class).build();
            Trigger tx = TriggerBuilder.newTrigger().withIdentity("CroneTrigger2")
                    .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(60).repeatForever()).build();
            try {
                sx.start();
                try {
                    sx.scheduleJob(jx,tx);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } catch (SchedulerException se) {
                se.printStackTrace();
            }
        } catch (SchedulerException ex) {
            Logger.getLogger(Principal.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
        public void stop() {
            UsuarioDAO u = new UsuarioDAO();
                        u.setOffiline();
                        s.shutdown();
                        Platform.exit();
                        System.exit(0);
        }

    @Override
    public void start(Stage stage) throws Exception {
        Scheduler s = StdSchedulerFactory.getDefaultScheduler();
        JobDetail j = JobBuilder.newJob(ChecarJob.class).build();
        Trigger t = TriggerBuilder.newTrigger().withIdentity("CroneTrigger")
                .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(60).repeatForever()).build();  
        try { 
        s.start();
        try {
            s.scheduleJob(j,t);
        } catch (Exception e) {
             e.printStackTrace();
        }      
        } catch (SchedulerException se) {
        se.printStackTrace();
        }
        Parent root = FXMLLoader.load(getClass().getResource("/fxml/Principal.fxml")); //carrega fxml
        Scene scene = new Scene(root); //coloca o fxml em uma cena
        stage.setScene(scene); // coloca a cena em uma janela
        stage.show(); //abre a janela
        setStage(stage);
    }

    public static Stage getStage() {
        return stage;
    }

    public static void setStage(Stage stage) {
        Principal.stage = stage;
    }

    public static void main(String[] args) {
        launch(args);
    }

}

Если я подниму ее из моей начальной стадии, я смогу't

Scheduler s = StdSchedulerFactory.getDefaultScheduler();
JobDetail j = JobBuilder.newJob(ChecarJob.class).build();
Trigger t = TriggerBuilder.newTrigger().withIdentity("CroneTrigger"

1 Ответ

2 голосов
/ 19 сентября 2019
  1. Определить ссылку на планировщик как член класса Application.
  2. Назначьте ссылку на планировщик в вашем методе запуска.
  3. Когда приложение остановлено, вызовите соответствующий метод в планировщике, чтобы безопасно отключить его.

Пример кода

public class Principal extends Application {
    private Scheduler s;

    public void start(Stage stage) throws Exception {
        s = StdSchedulerFactory.getDefaultScheduler();
        // other work ...
    }

    public void stop() {
        if (s != null) {
            // pass true as a parameter if you want to wait
            // for scheduled jobs to complete 
            // (though it will hang UI if you do that on FX thread).
            s.shutdown();  
        }
    }
}

Могут быть и другие проблемы с вашим кодом (я не проверял), и я не знаю, решит ли этот ответ суть вашей проблемы, ноэто позволит вам определить экземпляр планировщика в качестве ссылки в вашем приложении, что, по-видимому, является тем, о чем вы просите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...