В моем программном комплексе, представляющем собой сложную сетку модульных клиентов, подключенных к центральному серверу и выполняющих длительные интервальные съемки, я добавил возможность обновлять программное обеспечение.
byte[] file = recieve();
FileOutputStream fos = new FileOutputStream("software.jar");
fos.flush(); fos.write(file); fos.close();
После этого процессаПосле завершения клиент выполняет ряд шагов перед перезагрузкой.Из этих процессов они включают длительные периоды ожидания потоков, чтения и записи файлов и взаимодействия в сети.
Я не указал точно, что может быть или не быть ошибкой, однако в некоторых случаях я наблюдал сбой с hs_err_pid.log.
У меня также есть переменная final и static, которая называется SOFTWARE_VERSION.Я подтвердил, что эта переменная обновляется (при наблюдении через интерфейс сервера) без перезагрузки программного обеспечения после его замены.
Однако после некоторого тщательного рассмотрения я решил сразу же перезагрузить компьютер послеобновление программного обеспечения (эта программа будет выполняться при запуске).Поскольку было установлено, что целостность обновления не является надежной, я решил, что лучше всего начать ее заново.Возможно (не проверено) выполнить действие, подобное следующему:
Runtime.getRuntime().exec("sudo java -jar software.jar");
System.exit(0);
Однако я не знаю, насколько это будет надежно.Вы также можете попробовать запустить что-то вроде:
Runtime.getRuntime().exec("run_software.sh")
System.exit(0);
Затем в run_software.sh:
sleep 1000
sudo java -jar software.jar
Мне было бы интересно узнать, будет ли это работать.
Надеюсь, это поможет!