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

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

Сообщает об этом AsyncListener о невозможности завершения асинхронной операции.

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

UPDATE:

// 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.io.IOException, вызванные сбоями ввода-вывода из-за ненадежных исключений соединения или протокола, из-за логической ошибки из-за несоответствия между клиентом и сервером.

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

event.getThrowable();

РЕДАКТИРОВАТЬ для решения следующих вопросов

Забыв о 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);
        }
    }
}

Является ли теперь более понятным, как будет вызываться метод lister onError, поскольку возникло исключение при вызове метода запуска MyRunnableClass?

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

    }
});

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

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