AsyncListener#onError 的用法

2022-09-04 04:25:48

我不明白何时调用AsyncListener#onError方法。Javadoc没有帮助:

通知此异步管理器异步操作已完成。

它怎么会失败?如何重现此错误?

更新:

// 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。

它们通常是扩展 java.io.IOException 的可抛出项,这些操作是由由于不可靠的连接而导致的 I/O 故障引起的,或者由于客户端和服务器之间的不匹配而导致的逻辑错误而导致的协议级异常。

当 onError 被调用时,您可以通过调用以下命令来获取 Throwable:

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 方法,因为在调用 MyRunnableClass 的 run 方法时引发了异常?

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

    }
});

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

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


答案 2

推荐