use of org.apache.hc.core5.pool.StrictConnPool in project httpcomponents-core by apache.
the class H2RequesterBootstrap method create.
public H2AsyncRequester create() {
final ManagedConnPool<HttpHost, IOSession> connPool;
switch(poolConcurrencyPolicy != null ? poolConcurrencyPolicy : PoolConcurrencyPolicy.STRICT) {
case LAX:
connPool = new LaxConnPool<>(defaultMaxPerRoute > 0 ? defaultMaxPerRoute : 20, timeToLive, poolReusePolicy, new DefaultDisposalCallback<>(), connPoolListener);
break;
case STRICT:
default:
connPool = new StrictConnPool<>(defaultMaxPerRoute > 0 ? defaultMaxPerRoute : 20, maxTotal > 0 ? maxTotal : 50, timeToLive, poolReusePolicy, new DefaultDisposalCallback<>(), connPoolListener);
break;
}
final RequestHandlerRegistry<Supplier<AsyncPushConsumer>> registry = new RequestHandlerRegistry<>(uriPatternType);
for (final HandlerEntry<Supplier<AsyncPushConsumer>> entry : pushConsumerList) {
registry.register(entry.hostname, entry.uriPattern, entry.handler);
}
final ClientH2StreamMultiplexerFactory http2StreamHandlerFactory = new ClientH2StreamMultiplexerFactory(httpProcessor != null ? httpProcessor : H2Processors.client(), new DefaultAsyncPushConsumerFactory(registry), h2Config != null ? h2Config : H2Config.DEFAULT, charCodingConfig != null ? charCodingConfig : CharCodingConfig.DEFAULT, streamListener);
final TlsStrategy actualTlsStrategy = tlsStrategy != null ? tlsStrategy : new H2ClientTlsStrategy();
final ClientHttp1StreamDuplexerFactory http1StreamHandlerFactory = new ClientHttp1StreamDuplexerFactory(httpProcessor != null ? httpProcessor : HttpProcessors.client(), http1Config != null ? http1Config : Http1Config.DEFAULT, charCodingConfig != null ? charCodingConfig : CharCodingConfig.DEFAULT, DefaultConnectionReuseStrategy.INSTANCE, new DefaultHttpResponseParserFactory(http1Config), DefaultHttpRequestWriterFactory.INSTANCE, DefaultContentLengthStrategy.INSTANCE, DefaultContentLengthStrategy.INSTANCE, http1StreamListener);
final IOEventHandlerFactory ioEventHandlerFactory = new ClientHttpProtocolNegotiationStarter(http1StreamHandlerFactory, http2StreamHandlerFactory, versionPolicy != null ? versionPolicy : HttpVersionPolicy.NEGOTIATE, actualTlsStrategy, handshakeTimeout);
return new H2AsyncRequester(versionPolicy != null ? versionPolicy : HttpVersionPolicy.NEGOTIATE, ioReactorConfig, ioEventHandlerFactory, ioSessionDecorator, exceptionCallback, sessionListener, connPool, actualTlsStrategy, handshakeTimeout);
}
use of org.apache.hc.core5.pool.StrictConnPool in project httpcomponents-core by apache.
the class AsyncRequesterBootstrap method create.
public HttpAsyncRequester create() {
final ManagedConnPool<HttpHost, IOSession> connPool;
switch(poolConcurrencyPolicy != null ? poolConcurrencyPolicy : PoolConcurrencyPolicy.STRICT) {
case LAX:
connPool = new LaxConnPool<>(defaultMaxPerRoute > 0 ? defaultMaxPerRoute : 20, timeToLive, poolReusePolicy, new DefaultDisposalCallback<>(), connPoolListener);
break;
case STRICT:
default:
connPool = new StrictConnPool<>(defaultMaxPerRoute > 0 ? defaultMaxPerRoute : 20, maxTotal > 0 ? maxTotal : 50, timeToLive, poolReusePolicy, new DefaultDisposalCallback<>(), connPoolListener);
break;
}
final ClientHttp1StreamDuplexerFactory streamDuplexerFactory = new ClientHttp1StreamDuplexerFactory(httpProcessor != null ? httpProcessor : HttpProcessors.client(), http1Config != null ? http1Config : Http1Config.DEFAULT, charCodingConfig != null ? charCodingConfig : CharCodingConfig.DEFAULT, connStrategy, null, null, streamListener);
final IOEventHandlerFactory ioEventHandlerFactory = new ClientHttp1IOEventHandlerFactory(streamDuplexerFactory, tlsStrategy != null ? tlsStrategy : new BasicClientTlsStrategy(), handshakeTimeout);
return new HttpAsyncRequester(ioReactorConfig, ioEventHandlerFactory, ioSessionDecorator, exceptionCallback, sessionListener, connPool);
}
use of org.apache.hc.core5.pool.StrictConnPool in project httpcomponents-core by apache.
the class TestStrictConnPool method testCloseIdle.
@Test
public void testCloseIdle() throws Exception {
final HttpConnection conn1 = Mockito.mock(HttpConnection.class);
final HttpConnection conn2 = Mockito.mock(HttpConnection.class);
final StrictConnPool<String, HttpConnection> pool = new StrictConnPool<>(2, 2);
final Future<PoolEntry<String, HttpConnection>> future1 = pool.lease("somehost", null);
final Future<PoolEntry<String, HttpConnection>> future2 = pool.lease("somehost", null);
Assertions.assertTrue(future1.isDone());
final PoolEntry<String, HttpConnection> entry1 = future1.get();
Assertions.assertNotNull(entry1);
entry1.assignConnection(conn1);
Assertions.assertTrue(future2.isDone());
final PoolEntry<String, HttpConnection> entry2 = future2.get();
Assertions.assertNotNull(entry2);
entry2.assignConnection(conn2);
entry1.updateState(null);
pool.release(entry1, true);
Thread.sleep(200L);
entry2.updateState(null);
pool.release(entry2, true);
pool.closeIdle(TimeValue.of(50, TimeUnit.MILLISECONDS));
Mockito.verify(conn1).close(CloseMode.GRACEFUL);
Mockito.verify(conn2, Mockito.never()).close(ArgumentMatchers.any());
PoolStats totals = pool.getTotalStats();
Assertions.assertEquals(1, totals.getAvailable());
Assertions.assertEquals(0, totals.getLeased());
Assertions.assertEquals(0, totals.getPending());
PoolStats stats = pool.getStats("somehost");
Assertions.assertEquals(1, stats.getAvailable());
Assertions.assertEquals(0, stats.getLeased());
Assertions.assertEquals(0, stats.getPending());
pool.closeIdle(TimeValue.of(-1, TimeUnit.MILLISECONDS));
Mockito.verify(conn2).close(CloseMode.GRACEFUL);
totals = pool.getTotalStats();
Assertions.assertEquals(0, totals.getAvailable());
Assertions.assertEquals(0, totals.getLeased());
Assertions.assertEquals(0, totals.getPending());
stats = pool.getStats("somehost");
Assertions.assertEquals(0, stats.getAvailable());
Assertions.assertEquals(0, stats.getLeased());
Assertions.assertEquals(0, stats.getPending());
}
use of org.apache.hc.core5.pool.StrictConnPool in project httpcomponents-core by apache.
the class TestStrictConnPool method testLeaseRequestTimeout.
@Test
public void testLeaseRequestTimeout() throws Exception {
final HttpConnection conn1 = Mockito.mock(HttpConnection.class);
final StrictConnPool<String, HttpConnection> pool = new StrictConnPool<>(1, 1);
final Future<PoolEntry<String, HttpConnection>> future1 = pool.lease("somehost", null, Timeout.ofMilliseconds(0), null);
final Future<PoolEntry<String, HttpConnection>> future2 = pool.lease("somehost", null, Timeout.ofMilliseconds(0), null);
final Future<PoolEntry<String, HttpConnection>> future3 = pool.lease("somehost", null, Timeout.ofMilliseconds(10), null);
Assertions.assertTrue(future1.isDone());
final PoolEntry<String, HttpConnection> entry1 = future1.get();
Assertions.assertNotNull(entry1);
entry1.assignConnection(conn1);
Assertions.assertFalse(future2.isDone());
Assertions.assertFalse(future3.isDone());
Thread.sleep(100);
pool.validatePendingRequests();
Assertions.assertFalse(future2.isDone());
Assertions.assertTrue(future3.isDone());
}
use of org.apache.hc.core5.pool.StrictConnPool in project httpcomponents-core by apache.
the class TestStrictConnPool method testConnectionRedistributionOnTotalMaxLimit.
@Test
public void testConnectionRedistributionOnTotalMaxLimit() throws Exception {
final HttpConnection conn1 = Mockito.mock(HttpConnection.class);
final HttpConnection conn2 = Mockito.mock(HttpConnection.class);
final HttpConnection conn3 = Mockito.mock(HttpConnection.class);
final HttpConnection conn4 = Mockito.mock(HttpConnection.class);
final HttpConnection conn5 = Mockito.mock(HttpConnection.class);
final StrictConnPool<String, HttpConnection> pool = new StrictConnPool<>(2, 10);
pool.setMaxPerRoute("somehost", 2);
pool.setMaxPerRoute("otherhost", 2);
pool.setMaxTotal(2);
final Future<PoolEntry<String, HttpConnection>> future1 = pool.lease("somehost", null);
final Future<PoolEntry<String, HttpConnection>> future2 = pool.lease("somehost", null);
final Future<PoolEntry<String, HttpConnection>> future3 = pool.lease("otherhost", null);
final Future<PoolEntry<String, HttpConnection>> future4 = pool.lease("otherhost", null);
Assertions.assertTrue(future1.isDone());
final PoolEntry<String, HttpConnection> entry1 = future1.get();
Assertions.assertNotNull(entry1);
Assertions.assertFalse(entry1.hasConnection());
entry1.assignConnection(conn1);
Assertions.assertTrue(future2.isDone());
final PoolEntry<String, HttpConnection> entry2 = future2.get();
Assertions.assertNotNull(entry2);
Assertions.assertFalse(entry2.hasConnection());
entry2.assignConnection(conn2);
Assertions.assertFalse(future3.isDone());
Assertions.assertFalse(future4.isDone());
PoolStats totals = pool.getTotalStats();
Assertions.assertEquals(0, totals.getAvailable());
Assertions.assertEquals(2, totals.getLeased());
Assertions.assertEquals(2, totals.getPending());
pool.release(entry1, true);
pool.release(entry2, true);
Assertions.assertTrue(future3.isDone());
final PoolEntry<String, HttpConnection> entry3 = future3.get();
Assertions.assertNotNull(entry3);
Assertions.assertFalse(entry3.hasConnection());
entry3.assignConnection(conn3);
Assertions.assertTrue(future4.isDone());
final PoolEntry<String, HttpConnection> entry4 = future4.get();
Assertions.assertNotNull(entry4);
Assertions.assertFalse(entry4.hasConnection());
entry4.assignConnection(conn4);
totals = pool.getTotalStats();
Assertions.assertEquals(0, totals.getAvailable());
Assertions.assertEquals(2, totals.getLeased());
Assertions.assertEquals(0, totals.getPending());
final Future<PoolEntry<String, HttpConnection>> future5 = pool.lease("somehost", null);
final Future<PoolEntry<String, HttpConnection>> future6 = pool.lease("otherhost", null);
pool.release(entry3, true);
pool.release(entry4, true);
Assertions.assertTrue(future5.isDone());
final PoolEntry<String, HttpConnection> entry5 = future5.get();
Assertions.assertNotNull(entry5);
Assertions.assertFalse(entry5.hasConnection());
entry5.assignConnection(conn5);
Assertions.assertTrue(future6.isDone());
final PoolEntry<String, HttpConnection> entry6 = future6.get();
Assertions.assertNotNull(entry6);
Assertions.assertTrue(entry6.hasConnection());
Assertions.assertSame(conn4, entry6.getConnection());
totals = pool.getTotalStats();
Assertions.assertEquals(0, totals.getAvailable());
Assertions.assertEquals(2, totals.getLeased());
Assertions.assertEquals(0, totals.getPending());
pool.release(entry5, true);
pool.release(entry6, true);
totals = pool.getTotalStats();
Assertions.assertEquals(2, totals.getAvailable());
Assertions.assertEquals(0, totals.getLeased());
Assertions.assertEquals(0, totals.getPending());
}
Aggregations