Почему обработчик WindowClosing не выполняет фоновые задачи перед выходом из программы?

mainFrame().addWindowListener(new java.awt.event.WindowAdapter() {
    @Override
    public void windowClosing(java.awt.event.WindowEvent evt)
    {
        retrieveItems();
        closeAllConnections();
        System.exit(0);
    }
});

Для кода выше, retrieveItems() выполняется хорошо, но есть фоновая задача под названием doBackup() это внутри closeAllConnections() который не выполняется вообще. Программа просто кажется, чтобы пропустить задачу. Вот краткий обзор того, что closeAllConnections() содержит;

public void closeAllConnections()
{
    boolean shouldBackup = getBackupOnCloseStatus();
    if(shouldBackup)
    {
        doBackUp();
    }
    dbManager.disconnectDB();
}

После использования Netbeans Step-Debugger я заметил, что выполнение программы даже не входит в doBackup() метод до выхода из приложения. Это странно. Я был бы очень признателен за любую помощь в отношении того, что может быть причиной такого поведения. Спасибо хорошие люди!

Если эта часть дополнительной информации может быть полезна при поиске решения, я использую Swing Application Framework, поэтому задача doBackup() выглядит следующим образом...

@Action
public Task doBackUp()
{
    return new DoBackUpTask(getApplication());
}

private class DoBackUpTask extends org.jdesktop.application.Task<Object, Void> 
{
    private boolean done = false;

    DoBackUpTask(org.jdesktop.application.Application app) 
    {
        super(app);
        this.setMessage("Backing-up database...");
    }

    @Override 
    protected Object doInBackground() 
    {
        File destDir = new File(appManager.getBackUpDir());
        done = backUpDataBase(destDir);
        return null;
    }

    @Override 
    protected void succeeded(Object result) 
    {
        if(done)
        {
            setMessage("BackUp completed.");
        }
    }
}

2 ответа

Я думаю, что у вас есть еще один WindowListener в другом месте это звонит System.exit() или вы делаете JFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)любой из которых приведет к немедленному завершению работы приложения, независимо от того, какие другие потоки выполняются.

Возможно, это не лучший ответ, но я заметил, что при звонке System.exit(0) иногда это все отрежет. Однажды у меня возникла проблема при вызове метода, который зависел от результатов предыдущей строки. Все должно быть хорошо, но это не сработало правильно, потому что оно доходило до выполнения следующей строки до того, как предыдущая была закончена. Я уверен, что кто-то может больше рассказать о потоке рассылки событий и о том, почему это произошло, хотя все, что говорится в информатике, не должно. Но вот моя мысль: добавьте логическое возвращаемое значение в closeAllConnections, чтобы вернуть true после завершения, а затем переписайте слушатель окна следующим образом:

    mainFrame().addWindowListener(new java.awt.event.WindowAdapter() {
    @Override
    public void windowClosing(java.awt.event.WindowEvent evt)
    {
        boolean isClosed = false;
        while(!isClosed){
            retrieveItems();
            isClosed = closeAllConnections();
        }    
        System.exit(0);
    }
});

Может быть, это поможет.

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