Проблемы восстановления снимка через 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...");

}

0 ответов

Другие вопросы по тегам