Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java AsyncListener#onError的用法_Java_Asynchronous_Servlet 3.0 - Fatal编程技术网

Java AsyncListener#onError的用法

Java AsyncListener#onError的用法,java,asynchronous,servlet-3.0,Java,Asynchronous,Servlet 3.0,我不明白什么时候调用AsyncListener#onError方法。 Javadoc没有帮助: 通知此AsyncListener异步操作未能完成 它怎么会失败呢?我如何重现这个错误 更新: // in HttpServlet doGet method AsyncContext asyncContext = req.startAsync(); asyncContext.addListener(new AsyncListener() { // some code @Override

我不明白什么时候调用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);

我需要在其他线程中做什么才能使此异步操作失败?

如果在执行异步操作时引发异常,将调用onError

它们通常是一次性的,扩展了由于连接不可靠而导致的I/O故障或由于客户端和服务器之间不匹配而导致的逻辑错误而导致的协议级异常而导致的java.io.IOException

调用OneError时,您可以通过调用以下命令获得可丢弃的文件:

event.getThrowable();
编辑以解决mjaggard的后续问题

遗忘AsicCurror一秒钟,考虑下面的类:

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);
        }
    }
}
由于调用MyRunnableClass的run方法时引发了异常,现在是否更清楚如何调用侦听器的onError方法了

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

    }
});

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

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

为什么您觉得Javadoc不清楚?您希望它回答什么具体问题?正如我之前所写的,我想了解异步操作是如何失败的。我添加了一些代码示例:)您能用代码示例演示一下吗?据我所知,您在另一个线程中的执行是按照您的意愿完成的,但通常由执行者执行。这不知道AsyncContext,那么异常如何到达那里呢?与Thread类的run()方法一样,我们不能允许在throws类中声明异常或允许未捕获的异常,因为我们实际上并没有调用run方法,而是由java线程系统来管理它。因此,要补充Michael上面所说的内容,java线程系统必须捕获这些异常,并在调用它时将其传递给onError()。但是java线程系统无法访问AsyncListener,也无法将线程链接到侦听器。该死,愚蠢的stackoverflow将我的分数奖励给了我认为是错误的答案:-(@mjaggard请查看我编辑的答案,我希望它能解决您的问题。