Я работаю над проектом Java, в котором мне нужно восстановить состояние системы после завершения работы, вызванного событием (например, PowerOut или WindowMalfunction) . При восстановлении системы она должна возобновлять только те события, которые происходят после завершения работы, а не воспроизводить все события с самого начала.
Однако текущая реализация выводит все события с самого начала, даже те, что произошли до отключения. Я хочу, чтобы он возобновился только с точки после события выключения. Я использую сериализацию для сохранения и восстановления состояния системы и реализовал интерфейс Fixable для решения проблем во время восстановления.
Ожидаемое поведение >:
При запуске команды java GreenhouseControls -d dump.out она должна восстановить систему и выводить события только после события, вызвавшего завершение работы. .
Например:
Код: Выделить всё
System restored from dump.out
Restored system state:
Power On: false
Resuming system...
Bing!
Terminate
Вместо возобновления работы после завершения работы он выводит все события с начала:
Код: Выделить всё
Restored system state:
Power On: false
Resuming system...
Restarting system
Thermostat on night setting
Light is on
Light is off
...
(Outputs everything from the start)
Вот соответствующая часть кода, показывающая, как я пытаюсь восстановить систему. состояние.
Код: Выделить всё
// Minimal example: GreenhouseControls.java
import java.io.*;
public class GreenhouseControls implements Serializable {
protected boolean light = false;
protected boolean water = false;
protected String thermostat = "Day";
protected boolean fans = false;
protected boolean windowok = true;
protected boolean poweron = true;
private int errorcode;
public interface Fixable {
void fix();
void log();
}
public class PowerOn implements Fixable {
@Override
public void fix() {
poweron = true;
errorcode = 0;
}
@Override
public void log() {
System.out.println("Power restored");
}
}
public int getError() {
return errorcode;
}
public Fixable getFixable(int errorcode) {
if (errorcode == 2) return new PowerOn();
return null;
}
public void shutdown(int errorcode, String errorMessage) {
this.errorcode = errorcode;
try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("dump.out"))) {
out.writeObject(this);
} catch (IOException e) {
e.printStackTrace();
}
System.exit(0);
}
}
Код: Выделить всё
// Minimal example: Restore.java
import java.io.*;
public class Restore {
private GreenhouseControls gc;
public Restore(String filename) {
try (ObjectInputStream in = new ObjectInputStream(new FileInputStream(filename))) {
gc = (GreenhouseControls) in.readObject();
System.out.println("System restored from " + filename);
} catch (IOException | ClassNotFoundException e) {
System.out.println("Error during system restore: " + e.getMessage());
e.printStackTrace();
}
}
public void fixAndResume() {
if (gc != null) {
System.out.println("Restored system state:");
System.out.println("Power On: " + gc.poweron);
if (gc.getError() != 0) {
GreenhouseControls.Fixable fixable = gc.getFixable(gc.getError());
fixable.fix();
fixable.log();
}
System.out.println("Resuming system...");
// Instead of resuming all events, it should only resume from after the shutdown
}
}
public static void main(String[] args) {
Restore restore = new Restore("dump.out");
restore.fixAndResume();
}
}
- Я реализовал Класс Restore, который десериализует объект GreenhouseControls, сохраненный во время завершения работы.
- Состояние системы восстанавливается правильно, и проблема, вызвавшая завершение работы, устраняется с помощью интерфейса Fixable. Однако программа выводит все события с начала, а не возобновляет работу только с момента, следующего за событием, вызвавшим завершение работы.
Как я могу изменить свой класс Restore или системную логику, чтобы при запуске java GreenhouseControls -d dump.out, он возобновляет события только после завершения работы, а не повторяет все события с начала?
Подробнее здесь: https://stackoverflow.com/questions/790 ... tore-class