0

サーバーリソースからGoogleプレイスエンドポイントを呼び出すためにRESTletClientResourceを使用しています。具体的には、RESTリクエストはRESTlet ServerResourceを呼び出し、RESTlet ServerResourceはClientResourceを呼び出し、Googleプレイスの結果を返します。これは、TomcatでWebアプリケーションとして実行されます。

これは約1時間正常に機能し、その後各リクエストがハングします。tomcatを停止すると、すべてのリクエストがログで処理されるのがわかります。Tomcatは1時間ごとに再起動する必要があるため、これは非常に不安定です。

私はしばらくの間答えを探してきましたが、問題は接続が解放されていない可能性が高いことを確認しました。アドバイスは、表現に排気を使用し、クライアントリソースで停止することでした。

最新の安定バージョンのレストレット2.1.1を使用しています。

上記で説明したプロセスの実行方法は次のとおりです。

 ClientResource storeRoot = new ClientResource(placeEndPoint);
 Client c = (Client)storeRoot.getNext();

 String jsonString = storeRoot.get().getText();
    try {
    c.stop();
} catch (Exception e) {
    e.printStackTrace();
}

storeRoot.release();

サーバーリソースが表現を返す部分では、次のように排気と呼びます。

            JSONArray ja = new JSONArray(placesList);
    JsonRepresentation jr = new JsonRepresentation(ja);
    jr.setCharacterSet(CharacterSet.UTF_8);
    try {
        jr.exhaust();
        jr.release();
    } catch (IOException e) {
        e.printStackTrace();
    } finally{

    }

    return jr;

クライアントリソースがハングするのを防ぐ方法を知っている人はいますか?

4

2 に答える 2

0

問題は、ClientResourceが接続を閉じる際に問題を抱えていることです。私にとってうまくいったのは、apachehttpclientを使用することです。

次のメソッドを使用して、RESTletリソース内でhttpgetを実行しました。

 public String httpGet(String url) throws IllegalStateException, IOException {

    HttpClient httpclient = new DefaultHttpClient();

     // Prepare a request object
     HttpGet httpget = new HttpGet(url);

     // Execute the request
     HttpResponse response = httpclient.execute(httpget);

     // Examine the response status
     System.out.println(response.getStatusLine());

     // Get hold of the response entity
     HttpEntity entity = response.getEntity();

     // If the response does not enclose an entity, there is no need
     // to worry about connection release
     if (entity != null) {
         InputStream instream = entity.getContent();
         try {

             BufferedReader reader = new BufferedReader(
                     new InputStreamReader(instream));
             // do something useful with the response
             //System.out.println(reader.readLine());

             StringBuilder builder = new StringBuilder();
             String aux = "";

             while ((aux = reader.readLine()) != null) {
                 builder.append(aux);
             }

             String text = builder.toString();

             return text;

         } catch (IOException ex) {

             // In case of an IOException the connection will be released
             // back to the connection manager automatically
             throw ex;

         } catch (RuntimeException ex) {

             // In case of an unexpected exception you may want to abort
             // the HTTP request in order to shut down the underlying
             // connection and release it back to the connection manager.
             httpget.abort();
             throw ex;

         } finally {

             // Closing the input stream will trigger connection release
             instream.close();
             httpclient.getConnectionManager().shutdown();
         }

         // When HttpClient instance is no longer needed,
         // shut down the connection manager to ensure
         // immediate deallocation of all system resources

     }

     return null;
  }
于 2013-02-20T18:08:16.250 に答える
0

ClientConnectionHelperは、ClientResourceの接続を閉じる役割を果たします。リクエストが終了したら、storeRoot.release()を呼び出して、ClientConnectionHelperに接続を停止するように指示する必要があります。

于 2014-01-21T03:20:13.253 に答える