Безопасна ли замена ProxyFactory в потоке RESTEasy?
Я разработал сервис в RESTEasy с использованием ProxyFactory и ClientExecutor следующим образом:
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.
2 ответа
Мы используем это:
final ResteasyClient client = new ResteasyClientBuilder()
.connectionPoolSize(10)
.maxPooledPerRoute(5)
.build();
И после отладки я обнаружил, что (по крайней мере, в нашей ситуации) клиент RESTEasy по умолчанию использует ThreadSafeClientConnManager, поэтому я думаю, что нет необходимости указывать другой, хотя в соответствии с JavaDoc он не рекомендуется в пользу PoolingHttpClientConnectionManager (обратите внимание на дополнительные Http). Но это было исправлено в клиенте RESTEasy 3.0.5. Наконец: https://issues.jboss.org/browse/RESTEASY-948
Это джунгли администраторов соединений HTTP там..
Это сработало для меня. Просто нужно было найти способ настроить HTTP-движок Apache. В основном на основе RestEasy 3.0.5. Окончательный 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);
}