3

次のように、ProxyFactory と ClientExecutor を使用して RESTEasy でサービスを開発しました。

PoolingClientConnectionManager connectionManager = new PoolingClientConnectionManager();
DefaultHttpClient httpClient = new DefaultHttpClient(connectionManager);
HttpParams params = httpClient.getParams();
HttpConnectionParams.setConnectionTimeout(params, 5000);
HttpConnectionParams.setSoTimeout(params, 5000);
ClientExecutor clientExecutor = new ApacheHttpClient4Executor(httpClient);
MyClass client = ProxyFactory.create(MyClass.class, "http://www.example.com", clientExecutor);

それは常に完璧に機能しました。RESTEasy が ClientExecutor と ProxyFactory の両方を廃止した後、外部接続用に新しい ResteasyClient を提供しましたが、この新しい ResteasyClient がスレッドセーフかどうかはわかりません。これは、ドキュメントの新しいサンプル コードです。

ResteasyClient client = new ResteasyClientBuilder().build();
ResteasyWebTarget target = client.target("http://example.com/base/uri");

SimpleClient simple = target.proxy(SimpleClient.class);

更新: ResteasyClient でコードを使用したところ、これらのエラーの多くが発生しました。

javax.ws.rs.ProcessingException: Unable to invoke request

のせいで

java.lang.IllegalStateException: Invalid use of BasicClientConnManager: connection still allocated. Make sure to release the connection before allocating another one.
4

2 に答える 2

4

これを使用します:

    final ResteasyClient client = new ResteasyClientBuilder()
        .connectionPoolSize(10)
        .maxPooledPerRoute(5)
        .build();

そして、デバッグ後、(少なくとも私たちの状況では) RESTEasy クライアントはデフォルトで ThreadSafeClientConnManager を使用することがわかったので、別のものを指定する必要はないと思いますが、JavaDoc によれば、PoolingHttpClientConnectionManager を支持して非推奨になっています (余分に注意してください)。 Http)。しかし、これは RESTEasy クライアント 3.0.5.Final で修正されました: https://issues.jboss.org/browse/RESTEASY-948

それはそこにある HTTP 接続マネージャーのジャングルです..

于 2014-12-08T16:08:13.697 に答える
0

これは私にとってはうまくいきました。Apache HTTP エンジンをセットアップするためのフックを見つける必要がありました。主にRestEasy 3.0.5.Final APIに基づく

public static Object setupServiceProxy(@NotNull Class responseClass) {
    ResteasyProviderFactory factory = ResteasyProviderFactory.getInstance();
    ResteasyClientBuilder builder = new ResteasyClientBuilder().providerFactory(factory);
    ResteasyClient client = builder.httpEngine(setupHttpDefaults()).build();
    ResteasyWebTarget target = client.target(url);
    return target.proxy(responseClass);
}

public static ClientHttpEngine setupHttpDefaults() {
    PoolingClientConnectionManager connectionManager = new PoolingClientConnectionManager();
    DefaultHttpClient httpClient = new DefaultHttpClient(connectionManager);
    HttpParams params = httpClient.getParams();
    HttpConnectionParams.setConnectionTimeout(params, 30000);
    HttpConnectionParams.setSoTimeout(params, 30000);
    BasicHttpContext localContext = new BasicHttpContext();
    return new ApacheHttpClient4Engine(httpClient, localContext);
}
于 2014-08-07T17:30:08.257 に答える