通过VirtualBox Java API还原快照时出现问题
我想还原VirtualBox虚拟机的快照,然后立即用快照启动虚拟机。 我使用Java编写VirtualBox API,并在Windows中使用VBoxWebSrv.exe 大多数情况下,恢复和启动工作正常,但有时会出现以下异常:通过VirtualBox Java API还原快照时出现问题,java,virtualbox,restore,snapshot,locked,Java,Virtualbox,Restore,Snapshot,Locked,我想还原VirtualBox虚拟机的快照,然后立即用快照启动虚拟机。 我使用Java编写VirtualBox API,并在Windows中使用VBoxWebSrv.exe 大多数情况下,恢复和启动工作正常,但有时会出现以下异常: Exception in thread "main" org.virtualbox_5_1.VBoxException: VirtualBox error: rc=0x80bb0007 The machine 'win7test' is already locked b
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(会话,“gui”和“”)
当应用程序完成时,我正在调用session.unlockMachine(),这样机器就不应该再被锁定了
这是我的代码(我标记了提到的行):
publicstaticvoidmain(字符串[]args){
//要还原的快照数
int snapNo=3;
snapshotUUID=UUID[snapNo];
System.out.println(“连接…”);
//连接到VboxWebSrv
VirtualBoxManager mgr=VirtualBoxManager.createInstance(null);
经理联络(”http://localhost:18083“,“我的WINDOWS用户名”,“我的WINDOWS密码”);
//按名称获取虚拟机
IMachine vm=mgr.getVBox().findMachine(“win7test”);
//获取会话
ISession session=mgr.getSessionObject();
//将虚拟机锁定到会话
lockMachine(会话,LockType.Shared);
我在进步;
//------停止虚拟机------------
//获取控制台以管理虚拟机
IConsole console=session.getConsole();
如果(控制台!=null){
//停止虚拟机
progress=console.powerDown();
进度。等待完成(25000);
}
//-----还原快照------------
//通过UUID获取快照
ISnapshot snapshot=vm.findSnapshot(snapshotUUID);
进度=session.getMachine().restoreSnapshot(快照);
进度。等待完成(25000);
试一试{
System.out.println(“解锁机器…”);
//将其放在try-catch块中,因为有时这也会在某些测试期间导致异常
session.unlockMachine();
}捕获(例外e){
e、 printStackTrace();
}
//------启动虚拟机------------
progress=vm.launchVMProcess(会话,“gui”和“”);//在尝试启动虚拟机时,它似乎仍在解锁会话的过程中。在启动虚拟机之前进入睡眠状态对我来说很有效,但可能有更好的方法来检查会话是否已解锁hi,谢谢你的回答!我设法使其更稳定,但仍然有很多问题。不幸的是,我遇到了错误不总是一样的。我在正式的VirtualBox论坛上创建了一个线程,但不幸的是还没有解决方案。:(以下是该线程的链接:
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...");
}