別の 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