0

По какой-то причине HttpAsyncClient не делает запрос, если setConnectionManagerShared установлено на true. Я нашел это bug, но не мог понять, чего я не вижу.HttpAsyncClient не делает запрос, если setConnectionManagerShared имеет значение true

Вот как я создаю новый клиент

def apply(proxy: Option[HttpHost], cookieStore: Option[CookieStore]) = { 

val builder = HttpAsyncClients.custom. 
    setConnectionManager(connManager). 
    setConnectionManagerShared(true). 
    setDefaultCredentialsProvider(credentialsProvider). 
    setDefaultRequestConfig(defaultRequestConfig). 
    setSSLStrategy(sslStrategy) 

proxy.map(builder.setProxy) 
builder.setDefaultCookieStore(cookieStore.getOrElse(new BasicCookieStore)) // Use custom cookie store if necessary. 

// Create an HttpClient with the given custom dependencies and configuration. 
val client: HttpAsyncClient = new HttpAsyncClient(builder.build) 
client 
} 

Полный класс Располагается here.

Что я должен изменить?

ответ

1
DefaultConnectingIOReactor ioReactor = new DefaultConnectingIOReactor(); 
PoolingNHttpClientConnectionManager cm = new PoolingNHttpClientConnectionManager(ioReactor); 

CloseableHttpAsyncClient client1 = HttpAsyncClients.custom() 
     .setConnectionManager(cm) 
     .build(); 
CloseableHttpAsyncClient client2 = HttpAsyncClients.custom() 
     .setConnectionManager(cm) 
     .setConnectionManagerShared(true) 
     .build(); 

client1.start(); 
client2.start(); 

final CountDownLatch latch = new CountDownLatch(2); 
FutureCallback callback = new FutureCallback<HttpResponse>() { 
    @Override 
    public void completed(HttpResponse result) { 
     latch.countDown(); 
     System.out.println(result.getStatusLine()); 
    } 

    @Override 
    public void failed(Exception ex) { 
     latch.countDown(); 
     System.out.println(ex.getMessage()); 
    } 

    @Override 
    public void cancelled() { 
     latch.countDown(); 
    } 
}; 

client1.execute(new HttpGet("http://httpbin.org/get"), callback); 
client2.execute(new HttpGet("http://httpbin.org/get"), callback); 
latch.await(); 

// I am aware this is sloppy 
client1.close(); 
client2.close(); 
+0

Спасибо! Возможно ли, что он не работает, потому что я вызываю 'setConnectionManagerShared' для каждого созданного клиента? И если да, значит, мне нужно «владеть» клиентом незакрытым? – expert

+0

Должна быть служба, ответственная за запуск и закрытие лежащего в основе реактора ввода-вывода. Легче реализовать один клиент, владеющий «диспетчером соединений», но также может быть выполнен совершенно независимо. – oleg

+0

Получил это. Тогда я буду держать одного фиктивного клиента в моем синглете. Мне кажется, это немного хаки. – expert

Смежные вопросы