繁体   English   中英

JavaFx:关于石英调度程序

JavaFx: about quartz scheduler

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

您好我在使用石英调度程序的例程中遇到问题,我需要关闭调度程序方法:javafx stop

我无法在调度开始时声明调度程序:

@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);

    }

我需要声明它在我的开始之外才能在stop()中使用shutdown

@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);
    }

}

如果我将她从起步阶段中抚养出来,我将无法

 Scheduler s = StdSchedulerFactory.getDefaultScheduler(); JobDetail j = JobBuilder.newJob(ChecarJob.class).build(); Trigger t = TriggerBuilder.newTrigger().withIdentity("CroneTrigger" 
1 个回复
  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();  
        }
    }
}

您的代码可能还有其他问题(我尚未检查),并且我不知道此答案是否可以解决问题的核心,但是它可以让您将Scheduler实例定义为应用程序中的引用,这似乎是您要的东西。

1 Spring Autowire石英调度程序

我的Web服务器中运行着一个石英作业,该作业通过Spring进行如下配置: (StatisticsJob类扩展了QuartzJobBean并实现了executeInternal方法)。 服务器启动后,该作业将按照cron表达式成功执行。 但是,我还希望能够随意安排这项工作,就像用 ...

2 石英,配置了调度程序

如何创建quartz.properties文件,以便它已声明具有给定属性的调度程序数量,并使用StdSchedulerFactory getScheduler("schedulername")方法访问它们? ...

3 石英调度程序已停止调度

我使用石英1.7在我的Java程序中每5分钟执行一次心跳操作。 一天后,当我查看日志时,调度似乎已停止,并且停止输出任何心跳操作的日志。 但其他工作线程仍在运行并输出一些日志。 你见过这个问题吗? 谢谢。 ...

5 集群环境中的石英调度程序

我们使用的是石英调度程序,我的要求是在集群环境中的每台服务器上运行Job。 我们在集群环境中配置了2个服务器。 例如,如果Job计划在晚上8点进行,则它应同时在两个服务器上启动。 ...

6 防止石英调度程序回滚

我是这种方式的新手。我在应用程序中使用石英调度程序。 Quartz 2.x可以正常工作,但是发生异常时。 它回滚数据。所以我想停止自动回滚。 以下是qurtz属性文件 配置数据源 请帮我做到这一点。 ...

7 石英调度程序每天运行2次

我有一个Java应用程序,它每次生成报告并将生成的文件发送到已配置的邮件时,每天都会在UNIX OS上运行两次。 问题是该报告在第一次运行时成功生成了两个报告,但是在接下来的运行中,它没有提及任何问题都无法正常工作 我必须运行7个作业,第一个作业将被发送到第一封电子邮件,其中第一个低 ...

8 在石英调度程序上,需要澄清

几个关于Quartz的单独问题 如果我想要一次执行事件,那就足够了 考虑这个片段。 当预定时间“在此之前”时,事件运行,并且在预定时间在将来时无法执行 使用上面的代码,我观察以下内容 现在和计划执行的时间之间的差异恰好是1分钟.. 好的..尝试更大的间隔 ...

10 无法运行石英调度程序

我正在按照以下示例操作: http://www.quartz-scheduler.org/documentation/quartz-2.1.x/quick-start 在示例的一部分中,它提到“如果尚未设置日志记录,则所有日志都将发送到控制台,并且您的输出将类似于以下内容” 我尝试了 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM