web-dev-qa-db-ja.com

Jersey Client2.22.1を使用したGETリクエストで接続を閉じる

REST Javaコードからの呼び出し:

_<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-client</artifactId>
    <version>2.22.1</version>
</dependency> 
_

私のGETリクエストでは、

_javax.ws.rs.client.Invocation.Builder builder = ClientBuilder.newClient().target(url).request(); 
builder.get().readEntity(String.class);
_

readEntity(String.class)を呼び出した後、クライアントは閉じられます自動的に

私が使うなら、

_builder.get(String.class);  
_

同じ出力が得られます。

この場合、接続は自動的に閉じられますか、それとも手動で閉じる必要がありますか?

8
Devender

短い答え

次のコードについて考えてみます。

_Client client = ClientBuilder.newClient();
String result = client.target(url).request().get(String.class);
_

内部的には、リクエストが成功し、接続が閉じられると、Jerseyは Response#readEntity(Class<T>) を呼び出します。 したがって、この状況では接続を手動で閉じる必要はありません。

ここで、次のコードについて考えてみます。

_Client client = ClientBuilder.newClient();
Response response = client.target(url).request().get();
_

この状況では、接続を閉じるために Response#close() を呼び出す必要があります。または、 Response#readEntity(Class<T>) を呼び出して、Jerseyに接続を閉じさせます。

長い答え

ドキュメント で述べたように、 エンティティを読み取る でない場合は、 Response#close()を呼び出して手動で応答を閉じる必要があります。

詳細については、接続を閉じる方法について、Jerseyの ドキュメント を参照してください。

5.7。接続を閉じる

基になる接続は、要求ごとに開かれ、応答が受信されてエンティティが処理された後(エンティティが読み取られた後)に閉じられます。次の例を参照してください。

_final WebTarget target = ... some web target
Response response = target.path("resource").request().get();
System.out.println("Connection is still open.");
System.out.println("string response: " + response.readEntity(String.class));
System.out.println("Now the connection is closed.");
_

エンティティを読み取らない場合は、 response.close() によって手動で応答を閉じる必要があります。

また、エンティティが InputStreamresponse.readEntity(InputStream.class)によって)に読み込まれた場合、接続は InputStream 。その場合、 InputStream または Response は、 InputStream

さらに、 JerseyInvocation source をご覧ください。最も重要な部分を以下に引用します。

translate(ClientResponse, RequestScope, Class<T>)メソッドでは、response.readEntity(Class<T>)が呼び出されていることがわかります。

JerseyInvocation.Builder#get(Class<T>)

現在のリクエストに対してHTTPGETメソッドを同期的に呼び出します。

_@Override
public <T> T get(final Class<T> responseType)
    throws ProcessingException, WebApplicationException {

    return method("GET", responseType);
}
_

JerseyInvocation.Builder#method(String, Class<T>)

現在のリクエストに対して任意のメソッドを同期的に呼び出します。

_@Override
public <T> T method(final String name, final Class<T> responseType)
    throws ProcessingException, WebApplicationException {

    // responseType null check omitted for brevity

    requestContext.setMethod(name);
    return new JerseyInvocation(this).invoke(responseType);
}
_

JerseyInvocation#invoke(Class<T>)

要求を同期的に呼び出し、指定されたタイプの応答を受信します。

_@Override
public <T> T invoke(final Class<T> responseType)
    throws ProcessingException, WebApplicationException {

    // responseType null check omitted for brevity

    final ClientRuntime runtime = request().getClientRuntime();
    final RequestScope requestScope = runtime.getRequestScope();

    return requestScope.runInScope(new Producer<T>() {

        @Override
        public T call() throws ProcessingException {

            try {

                return translate(runtime.invoke(requestForCall(requestContext)), 
                                 requestScope, responseType);

            } catch (final ProcessingException ex) {
                // Exception handling omitted for brevity
            }
        }
    });
}
_

JerseyInvocation#translate(ClientResponse, RequestScope, Class<T>)

リクエストが成功した場合、レスポンスエンティティは指定されたJava type using Response#readEntity(Class<T>)

_private <T> T translate(final ClientResponse response, final RequestScope scope, 
    final Class<T> responseType) throws ProcessingException {

    if (responseType == Response.class) {
        return responseType.cast(new InboundJaxrsResponse(response, scope));
    }

    if (response.getStatusInfo().getFamily() == Response.Status.Family.SUCCESSFUL) {

        try {

            return response.readEntity(responseType);

        } catch (final ProcessingException ex) {
            // Exception handling omitted for brevity
        }

    } else {
        throw convertToException(new InboundJaxrsResponse(response, scope));
    }
}
_
18
cassiomolin