使用AsyncListener#onError

时间:2014-02-18 16:25:05

标签: 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);

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

1 个答案:

答案 0 :(得分:5)

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

onError。

它们通常是Throwables,它们会扩展由I / O失败引起的java.io.IOException,因为由于客户端和服务器之间不匹配而导致逻辑错误导致连接或协议级异常不可靠。

通过调用:

调用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方法实际上是因为正在执行的代码的所有者也是持有对侦听器的引用的所有者。