使用AsyncListener#onError

dre*_*her 13 java asynchronous servlet-3.0

我不明白何时调用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);
Run Code Online (Sandbox Code Playgroud)

在其他线程中我需要做什么来使这个异步操作失败?

Mic*_*use 5

如果在执行异步操作时抛出异常,将调用onError.

它们通常是,由于一个逻辑错误延伸,因为客户端和服务器之间的不匹配所造成的,因为不可靠的连接或协议级异常的I/O故障产生java.io.IOException将Throwable.

调用onError时可以获取Throwable:

event.getThrowable();
Run Code Online (Sandbox Code Playgroud)

编辑以解决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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在更清楚的是如何调用侦听器的onError方法,因为在调用MyRunnableClass的run方法时引发了异常?

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

    }
});

Executors.newSingleThreadScheduledExecutor().schedule(mrc, 1000L, TimeUnit.MILLISECONDS);
Run Code Online (Sandbox Code Playgroud)

这与AsyncContext如何保存到侦听器并且如果遇到它希望向侦听器报告的异常时通知它没有什么不同.如何调用run方法实际上是次要的事实,即正在执行的代码的所有者也是持有对侦听器的引用的所有者.