В настоящее время я работаю над 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");
}
}
Я не знаком с кварцем, но, похоже, у вас есть два разных экземпляра 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
.The JobDetail object is created by the Quartz client (your program) at the time the Job is added to the scheduler.
Похоже, ты прав.
Main
класса?