5

別の Web サービスを呼び出す Play 2.1 Java Web サービスがあります。私のサービスは、他の Web サービスの XML 応答を変換して作成された JSON を提供します。

最初は、Jersey-Client ライブラリを使用して 2 番目のサービスを呼び出していました。これはブロッキング呼び出しであるため、並列で 500 スレッドを許可するように設定を変更しました。私はそれで良い結果を得ました.ガトリングテストを行ったところ、非常に高速でした(離れたサーバーで10,000リクエストを処理するのに32秒).

次に、非同期呼び出しのみを使用して I/O を最適化することにしました。ここで、デフォルトのスレッド プール パラメータを持つ jersey ブロッキング クライアントの代わりに、play.libs.WS クライアントを使用します。プロミスを使用して結果を取得しますが、コードの残りの部分は以前とまったく同じです。

奇妙なことに、私のガトリング テスト (いくつかの HTTP GET 要求を送信する単なるループ) のパフォーマンスが低下し、10 倍以上遅くなりました...

「default-dispatcher」のスレッド数を増やそうとしましたが、改善されません。

単一のスレッドが WS 呼び出しの後に XML および Json 変換を処理するためでしょうか?

アプリは次のように構成されています。

//controller : 
Promise<Response> = myService.remoteEntities();

return async(promise.map(new Function<Response, Result>() {
        public Result apply(Response response) {
          List<Entity> entities = // ... XPATH and DOM parsing
          return ok(jsonp(callback, toJson(entities)));
        }      
});  

myService.remoteEntities は次のように定義されています。

public Promise<List<Entity>> myServiceMethod {
 return WS.url(url.toString()) 
}

注:myServiceはSpringサービスシングルトンであり、私のルート/コントローラーは「@」表記でSpringを使用します。これを別のクラスに入れて、テストにモックを使用できるようにしました

ありがとう、ロイック

注: 最初にここに問題を投稿しました: https://groups.google.com/forum/?fromgroups=#!topic/play-framework/SDpPA6UPyFQ

4

0 に答える 0