Использование AsyncListener#onError

Я не понимаю, когда вызывается метод AsyncListener#onError. Javadoc не помогает:

уведомляет этот AsyncListener о том, что асинхронная операция не завершена.

как он может потерпеть неудачу? Как я могу воспроизвести эту ошибку?

обновление:

// in HttpServlet doGet method
AsyncContext asyncContext = req.startAsync();
asyncContext.addListener(new AsyncListener() {
    // some code
    @Override
    public void onError(AsyncEvent event) {
        // when is it called?
    }
});
executeInSomeOtherThread(asyncContext);

что мне нужно сделать в другом потоке, чтобы не выполнить эту асинхронную операцию?

1 ответов


onError будет вызываться, если при выполнении асинхронной операции возникло исключение.

Они, как правило, Throwables, которые расширяют java.Ио.Исключение IOException, вызванное сбоями ввода-вывода из-за ненадежного соединения или исключений уровня протокола из-за логической ошибки из-за несоответствия между клиентом и сервером.

вы можете получить Throwable, когда onError вызывается вызовом:

event.getThrowable();

изменить адрес последующие вопросы mjaggard

забыв о AsyncContext на секунду, рассмотрим следующий класс:

public class MyRunnableClass implements Runnable {
    private Listener mListener;

    interface Listener {
        void onError(Throwable error);
    }

    public void setListener(Listener listener) {
        mListener = listener;
    }

    @Override
    public void run() {
        // Some important code to be executed goes here

        // Pretend an exception was caught in a try/catch/finally
        // block that was doing an I/O operation

        Throwable someError = new IOException();

        if (mListener != null) {
            mListener.onError(someError);
        }
    }
}

Теперь более ясно, как будет вызываться метод onerror прослушивателя, потому что при вызове метода run MyRunnableClass возникло исключение?

MyRunnableClass mrc = new MyRunnableClass();
mrc.setListener(new Listener() {
    @Override
    public void onError(Throwable error) {

    }
});

Executors.newSingleThreadScheduledExecutor().schedule(mrc, 1000L, TimeUnit.MILLISECONDS);

Это ничем не отличается от того, как AsyncContext удерживает слушателя и уведомляет его, если он сталкивается с исключением, которое он хочет сообщить слушателю. Как метод run вызывается действительно вторичен по отношению к тому, что владелец кода, который выполняется также содержит ссылку на слушателя.