Проблемы восстановления снимка через VirtualBox Java API
Я хочу восстановить моментальные снимки виртуальной машины VirtualBox и сразу после этого запустить виртуальную машину со снимком. Я пишу на Java с помощью VirtualBox API и использую VBoxWebSrv.exe в Windows.
Чаще всего работает восстановление и запуск, но иногда я получаю следующее исключение:
Exception in thread "main" org.virtualbox_5_1.VBoxException: VirtualBox error: rc=0x80bb0007 The machine 'win7test' is already locked by a session (or being locked or unlocked) (0x80bb0007)
Исключение возникает при выполнении следующей строки: vm.launchVMProcess(session, "gui", "");
Я вызываю session.unlockMachine(), когда приложение завершается, поэтому машина больше не должна быть заблокирована.
Это мой код (я пометил упомянутую строку):
public static void main(String[] args) {
// Number of Snapshot to restore
int snapNo = 3;
snapshotUUID = UUIDs[snapNo];
System.out.println("CONNECT...");
// Connect to VboxWebSrv
VirtualBoxManager mgr = VirtualBoxManager.createInstance(null);
mgr.connect("http://localhost:18083", "MY_WINDOWS_USERNAME", "MY_WINDOWS_PASSWORD");
// Get VM by name
IMachine vm = mgr.getVBox().findMachine("win7test");
// get Session
ISession session = mgr.getSessionObject();
// Lock VM to Session
vm.lockMachine(session, LockType.Shared);
IProgress progress;
// ------------ STOP VM ------------
// get Console to manage the VM
IConsole console = session.getConsole();
if (console != null) {
// STOP VM
progress = console.powerDown();
progress.waitForCompletion(25000);
}
// ------------ RESTORE SNAPSHOT ------------
// get Snapshot by UUID
ISnapshot snapshot = vm.findSnapshot(snapshotUUID);
progress = session.getMachine().restoreSnapshot(snapshot);
progress.waitForCompletion(25000);
try {
System.out.println("unlock machine...");
// Put this in a try-catch-block because sometimes this caused an exception too during some tests
session.unlockMachine();
} catch (Exception e) {
e.printStackTrace();
}
// ------------ START VM ------------
progress = vm.launchVMProcess(session, "gui", ""); // <<<<< HERE THE EXCEPTION OCCURS!
progress.waitForCompletion(25000);
// Unlock VM
session.unlockMachine();
System.out.println("DONE...");
}