Помимо final Client client = ClientBuilder.newClient();
также возможно
final ClientBuilder builder = ClientBuilder.newBuilder();
final Client client = builder.build();
, чтобы получить экземпляр Client
. В чем преимущество последнего?
Мне просто интересно: возможно ли использовать ClientBuilder
для одновременного построения Client
экземпляров и, в частности, использовать экземпляры Client
, построенные таким образом одновременно?
Я не смог найти четкого утверждения по этому поводу, просто следующее из документации RESTEasy:
Одним из решений по умолчанию, принятых HttpClient и принятых Resteasy, является использование org. apache .http.impl.conn.SingleClientConnManager, который управляет одним сокетом в любой момент времени и который поддерживает вариант использования, в котором один или несколько вызовов выполняются последовательно из одного потока. Для многопоточных приложений SingleClientConnManager можно заменить на org. apache .http.impl.conn.tsccm.ThreadSafeClientConnManager:
ClientConnectionManager cm = new ThreadSafeClientConnManager();
HttpClient httpClient = new DefaultHttpClient(cm);
ApacheHttpClient4Engine engine = new ApacheHttpClient4Engine(httpClient);
Похоже, что экземпляры RESTEasy Client
по умолчанию не безопасны для потоков .
Относительно ClientBuilder
, глядя на ResteasyClientBuilderImpl. java:
ClientHttpEngine engine = httpEngine != null ? httpEngine : new ClientHttpEngineBuilder43().resteasyClientBuilder(this).build();
if (resetProxy) {
this.defaultProxy = null;
}
return createResteasyClient(engine, executor, cleanupExecutor, scheduledExecutorService, config);
это похоже на каждый Client
экземпляр, созданный тем же ClientBuilder
использует тот же ClientHttpEngine
, используя SingleClientConnManager
, таким образом, используя то же соединение.
Если вышеприведенное верно, то я бы сказал, что один и тот же экземпляр ClientBuilder
небезопасен для одновременного использования - если только настроен на использование ThreadSafeClientConnManager
.