java - 处理异步 Web 服务请求的异常

标签 java playframework playframework-2.1

对于使用 Play!Framework 2.1 WS 库实现 Web 服务请求,我还是个新手。现在,我无法理解 WS 库的行为。

首先,我有这样的代码:

public static Result espnRss() {
    try {
        // do request
        return async(
            WS.url("http://espnfc.com/rss/news?section=premierleague").get().map(
                new F.Function<WS.Response, Result>() {
                    @Override
                    public Result apply(WS.Response response) throws Throwable {
                        return ok("Success!"); // success request
                    }
                }
            )
        );
    } catch (Exception e) {
        // exception occured
        return internalServerError("Oops, connect exception occured!");
    }
}

当我尝试请求 espnRss 操作时,我得到了 SUCCESS 响应。

然后,我想在请求上设置 WS 超时。所以,我像这样更改了以前的代码:

public static Result espnRss() {
    try {
        // set request timeout for 1000 ms and do request
        return async(
            WS.url("http://espnfc.com/rss/news?section=premierleague").setTimeout(1000).get().map(
                ... // same as previous
            )
        );
    } catch (Exception e) {
        // exception occured
        return internalServerError("Oops, connect exception occured!");
    }
}

我的互联网连接速度不快(下载速度约为 40 KB/s),我故意这样做(设置请求超时 1 秒)以执行异常处理代码。

但是,我得到了框架的默认响应,而不是 internalServerError 响应提供的代码。

Execution Exception 
[TimeoutException: No response received after 1000] 

谁能解释一下为什么使用我上面的代码无法捕获 WS 请求的异常?使用 Play!Framework WS 库处理异常的最佳方式是什么?

最佳答案

处理发生在异步请求上的异常,例如WS使用 Play!Framework 2.1.0 请求,Promise 上有方法命名为 recover(F.Function<java.lang.Throwable,A> function) .

当我们想要处理使用 WS 请求时发生的所有异常时,应该调用该方法图书馆。所以,我使用如下代码解决了这个问题:

public static Result espnRss() {
    // do request
    return async(
        WS.url("http://espnfc.com/rss/news?section=premierleague").setTimeout(100).get().map(
            new F.Function<WS.Response, Result>() {
                @Override
                public Result apply(WS.Response response) throws Throwable {
                    return ok("Success!"); // success request
                }
            }
        ).recover( // to handle error occured on redeemed PROMISE
            new F.Function<Throwable, Result>() {
                @Override
                public Result apply(Throwable throwable) throws Throwable {
                    // option to distinguish exception
                    if (throwable instanceof TimeoutException) {
                        return internalServerError("Oops, time out exception occured!");
                    } else {
                        return internalServerError("Oops, other exception occured!");
                    }
                }
            }
        )
    );
}

关于java - 处理异步 Web 服务请求的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15411186/

相关文章:

Play 2.1.1中Json写入

scala - 面对 Play2.x 和新的 newRelic javaagent 的问题

java - 我们可以以编程方式更改状态栏或通知栏位置吗

java - YouTube JAVA API 中的错误 OAuth 2.0

java - 更改 ListView 的背景颜色项,同时保持自定义 Drawable 的效果

mongodb - ReactiveMongo + TypeSafe Stack => 生产?

java - Update() 方法在带有 h2 数据库的 Play Framework 中不起作用

java - 如何仅在给定已实现的方法的情况下创建队列?

json - play 框架 - 如何更新 json 索引数组项

java - Play框架-测试POST Controller 方法