Java CRaC возобновляет работу с контрольной точки с аргументами
Я экспериментирую с CRaC на Azul JVM. Я построил контрольную точку своей программы с помощью
$JAVA_CMD -XX:CRaCCheckpointTo=cr -jar target/cractest-0.1.0-standalone.jar
И я могу успешно восстановить его с помощью
$JAVA_CMD -XX:CRaCRestoreFrom=cr
Все работает. На следующем шаге я хочу передать аргументы программе при восстановлении, чтобы программа могла их подобрать, в идеале, как показано ниже:
$JAVA_CMD -XX:CRaCRestoreFrom=cr -- arg1 arg2 arg3
И обычно я бы получил доступarg1 arg2 arg3
вString[] args
параметрmain
, но поскольку мы возобновляем контрольную точку, у нас больше нет доступа к этому массиву.
Как я могу получить доступ к параметрам восстановления контрольной точки? Доступен ли он в каком-либо объекте контекста во время выполнения?
2 ответа
CRaC работает не так. Вы должны думать об этом как о работающем приложении, которое было приостановлено. Точно так же, как вы не можете изменить аргументы наmain()
работающего приложения, вы не можете сделать это с помощью CRaC.
Что вы можете сделать, это использоватьafterRestore()
метод класса, который реализуетResource
интерфейс и читать новые значения из какого-либо источника (например, файла).
Теоретически вы можете реализовать эту функциональность, добавив в свою программу ресурс, который будет читать аргументы из файла и вызывать некоторый Java-код. А потом, перед восстановлением, записать параметры в файл.
Все это выглядит достаточно общим, чтобы его можно было реализовать в JDK. Итак, поскольку https://github.com/openjdk/crac/pull/16 вы можете передать имя класса и аргументы для запуска при восстановлении. Пожалуйста, проверьте прилагаемый JavaCompilerCRaC.java.
Возможность запуска некоторого Java-кода предназначена для выполнения некоторых действий после восстановления. Например, установка каких-то параметров и т.п. Командная строка выглядит так:
java -XX:CRaCRestoreFrom=cr ClassName arg1 arg2 ...
CRaC позволяет устанавливать свойства при восстановлении с помощью
java -XX:CRaCRestoreFrom=cr -DpropName=propValue
Но вы можете реализовать это самостоятельно:
public class Props {
public static void main(String[] args) throws Exception {
for (int i = 0; i < args.length; i += 2) {
System.setProperty(args[i], args[i + 1]);
}
printProperties();
}
}
java -XX:CRaCRestoreFrom=cr Props propName propValue
Таким образом, предел — это то, что вы можете выразить с помощью Java-кода.
Будем признательны за отзывы об этой функциональности.