通过VirtualBox Java API还原快照时出现问题

通过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

我想还原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 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...");

}