Наблюдатель не добавлен

1

В настоящее время я работаю над Java-приложением, которое каждую секунду проверяет температуру моего компьютера. Для времени я сделал класс Timer который работает с Quartz и для проверки температуры я сделал класс под названием SysKeeper. Моя проблема заключается в том, что я хочу, чтобы SysKeeper был уведомлен о срабатывании Timer, но мой Observer не работает, потому что Syskeeper не добавлен как Observer.

Здесь вы видите мой класс Syskeeper:

public class SysKeeper implements Observer {
    private double temp;

    public void start() {
        Log.info("SysKeeper starting");
        Main.timer.addObserver(this);
    }

    private void checkTemp() {
        String buffer = CmdExecutor.execute("sudo vcgencmd measure_temp");
        String[] splitBuffer = buffer.split("=");
        String[] splitBuffer1 = splitBuffer[1].split("\'");
        temp = Double.parseDouble(splitBuffer1[0]);
        if (temp > 70.0) {
            //Main.not.sendMessage("Reached crit Temp: " + temp);
        }
        Log.info(temp + "");
    }

    public void kill() {
    }

    @Override
    public void update(Observable o, Object arg) {
        System.out.println("HI");
        this.checkTemp();
    }
}

И это мой класс Timer:

public class Timer extends Observable implements Job {

    public void start() {
        try {
            Trigger trigger = TriggerBuilder
                    .newTrigger()
                    .withIdentity("timer", "timer")
                    .withSchedule(
                            CronScheduleBuilder.cronSchedule("0/1 * * * * ?"))
                    .build();

            JobDetail job = JobBuilder.newJob(Timer.class)
                    .withIdentity("timer", "timer").build();

            Scheduler scheduler = new StdSchedulerFactory().getScheduler();
            scheduler.start();
            scheduler.scheduleJob(job, trigger);
        } catch (SchedulerException ex) {
            Logger.getLogger(Timer.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public void execute(JobExecutionContext jec) throws JobExecutionException {
        this.setChanged();
        this.notifyObservers();
        System.out.println("" + countObservers());//always 0
    }

    public void kill() {

    }
}

Вот мой Main класс:

public class Main {

    public static final String spliterNetwork = ";";
    public static final String spliterParameter = "#";

    public static Timer timer;
    public static Server ser;
    public static SysKeeper kep;
    public static GPIO gpio;
    public static Log log;

    public static void main(String[] args) throws UnknownHostException {
        Main.init(args);
        Main.start();

        Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
            @Override
           public void run() {
                Main.stop();
            }
        }));
    }

    public static void init(String[] args) {
       timer = new Timer();
        log = new Log();
        ser = new Server();
        kep = new SysKeeper();
        gpio = new GPIO();
    }

    public static void start() throws UnknownHostException {
        Log.info("Welcome to iServer @ " + InetAddress.getLocalHost());
        timer.start();
        log.start();
        ser.start();
        kep.start();
        gpio.start();
    }

    public static void stop() {
        Log.info("Programm shuts down");
        timer.kill();
        log.kill();
        ser.kill();
        kep.kill();
        gpio.kill();

        timer = null;
        log = null;
        ser = null;
        kep = null;
        gpio = null;
        Log.info("Good bye");
   }
}
  • 0
    Не могли бы вы поделиться своим исходным кодом Main класса?
Теги:

1 ответ

1
Лучший ответ

Я не знаком с кварцем, но, похоже, у вас есть два разных экземпляра Timer:

  • Первый Timer который хранится в Main.timer, созданный в timer = new Timer() и имеющий наблюдателя, добавленного в Main.timer.addObserver(this);SysKeeper). Этот экземпляр никогда не выполняется, т.е. Он никогда не вызывает метод execute().
  • Второй Timer, созданный первым Timer в строке JobDetail job = JobBuilder.newJob(Timer.class)... этот Timer - тот, который выполняется (scheduler.scheduleJob(job, trigger);), но он не имеет никакого Observer.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню