3

Play!Framework2.1WSライブラリを使用して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!");
    }
}

アクションをリクエストしようとすると、espnRssSUCCESS応答が返されました。

次に、リクエストに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ライブラリを使用して例外を処理する最良の方法はどのようになっていますか?

4

2 に答える 2

9

Play!Framework 2.1.0を使用したリクエストなど、非同期リクエストで発生する例外を処理するために、 namedにメソッドがあります。WSPromiserecover(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!");
                    }
                }
            }
        )
    );
}
于 2013-03-22T03:13:44.947 に答える
2

私はPlayフレームワークに精通していasyncませんが、何らかの未来を返す/使用している必要があります。リクエストは実際には別のスレッドで実行されますが、例外は明らかにtry..catchハンドラーによってキャッチされません。

リクエストの実行結果をテストできるようにするためにonComplete適用できるような関数/メソッドが必要です。async

于 2013-03-21T08:03:05.453 に答える