From 8468be55de9349cef49afcb901d15a96bf787ded Mon Sep 17 00:00:00 2001 From: Mikhail Chernyakov Date: Thu, 2 Jan 2020 20:40:06 +0100 Subject: [PATCH 1/3] thread factory for channelManager --- .../AsyncHttpClientConfig.java | 15 +++++++++ .../DefaultAsyncHttpClientConfig.java | 32 +++++++++++++++++++ .../config/AsyncHttpClientConfigDefaults.java | 5 +++ .../netty/channel/ChannelManager.java | 2 +- .../config/ahc-default.properties | 1 + .../AsyncHttpClientTypesafeConfig.java | 10 ++++++ .../AsyncHttpClientTypesafeConfigTest.java | 4 +++ 7 files changed, 68 insertions(+), 1 deletion(-) diff --git a/client/src/main/java/org/asynchttpclient/AsyncHttpClientConfig.java b/client/src/main/java/org/asynchttpclient/AsyncHttpClientConfig.java index 862aa2ce9f..b2317d115a 100644 --- a/client/src/main/java/org/asynchttpclient/AsyncHttpClientConfig.java +++ b/client/src/main/java/org/asynchttpclient/AsyncHttpClientConfig.java @@ -51,6 +51,13 @@ public interface AsyncHttpClientConfig { */ String getThreadPoolName(); + /** + * Return the name of {@link org.asynchttpclient.netty.channel.ChannelManager}, which is used for thread naming and debugging. + * + * @return the name. + */ + String getChannelThreadPoolName(); + /** * Return the maximum number of connections an {@link AsyncHttpClient} can handle. * @@ -149,6 +156,14 @@ public interface AsyncHttpClientConfig { */ ThreadFactory getThreadFactory(); + /** + * Return the {@link java.util.concurrent.ThreadFactory} an {@link org.asynchttpclient.netty.channel.ChannelManager} use for handling channels. + * + * @return the {@link java.util.concurrent.ThreadFactory} an {@link org.asynchttpclient.netty.channel.ChannelManager} use for handling channels. + * If no {@link ThreadFactory} has been explicitly provided, this method will return null + */ + ThreadFactory getChannelThreadFactory(); + /** * An instance of {@link ProxyServer} used by an {@link AsyncHttpClient} * diff --git a/client/src/main/java/org/asynchttpclient/DefaultAsyncHttpClientConfig.java b/client/src/main/java/org/asynchttpclient/DefaultAsyncHttpClientConfig.java index d26612fb6d..5f987d8f99 100644 --- a/client/src/main/java/org/asynchttpclient/DefaultAsyncHttpClientConfig.java +++ b/client/src/main/java/org/asynchttpclient/DefaultAsyncHttpClientConfig.java @@ -112,6 +112,7 @@ public class DefaultAsyncHttpClientConfig implements AsyncHttpClientConfig { // internals private final String threadPoolName; + private final String channelThreadPoolName; private final int httpClientCodecMaxInitialLineLength; private final int httpClientCodecMaxHeaderSize; private final int httpClientCodecMaxChunkSize; @@ -128,6 +129,7 @@ public class DefaultAsyncHttpClientConfig implements AsyncHttpClientConfig { private final int soRcvBuf; private final Timer nettyTimer; private final ThreadFactory threadFactory; + private final ThreadFactory channelThreadFactory; private final Consumer httpAdditionalChannelInitializer; private final Consumer wsAdditionalChannelInitializer; private final ResponseBodyPartFactory responseBodyPartFactory; @@ -199,6 +201,7 @@ private DefaultAsyncHttpClientConfig(// http // internals String threadPoolName, + String channelThreadPoolName, int httpClientCodecMaxInitialLineLength, int httpClientCodecMaxHeaderSize, int httpClientCodecMaxChunkSize, @@ -212,6 +215,7 @@ private DefaultAsyncHttpClientConfig(// http ByteBufAllocator allocator, Timer nettyTimer, ThreadFactory threadFactory, + ThreadFactory channelThreadFactory, Consumer httpAdditionalChannelInitializer, Consumer wsAdditionalChannelInitializer, ResponseBodyPartFactory responseBodyPartFactory, @@ -287,6 +291,7 @@ private DefaultAsyncHttpClientConfig(// http // internals this.threadPoolName = threadPoolName; + this.channelThreadPoolName = channelThreadPoolName; this.httpClientCodecMaxInitialLineLength = httpClientCodecMaxInitialLineLength; this.httpClientCodecMaxHeaderSize = httpClientCodecMaxHeaderSize; this.httpClientCodecMaxChunkSize = httpClientCodecMaxChunkSize; @@ -298,6 +303,7 @@ private DefaultAsyncHttpClientConfig(// http this.allocator = allocator; this.nettyTimer = nettyTimer; this.threadFactory = threadFactory; + this.channelThreadFactory = channelThreadFactory; this.httpAdditionalChannelInitializer = httpAdditionalChannelInitializer; this.wsAdditionalChannelInitializer = wsAdditionalChannelInitializer; this.responseBodyPartFactory = responseBodyPartFactory; @@ -581,6 +587,11 @@ public String getThreadPoolName() { return threadPoolName; } + @Override + public String getChannelThreadPoolName() { + return channelThreadPoolName; + } + @Override public int getHttpClientCodecMaxInitialLineLength() { return httpClientCodecMaxInitialLineLength; @@ -636,6 +647,11 @@ public ThreadFactory getThreadFactory() { return threadFactory; } + @Override + public ThreadFactory getChannelThreadFactory() { + return channelThreadFactory; + } + @Override public Consumer getHttpAdditionalChannelInitializer() { return httpAdditionalChannelInitializer; @@ -732,6 +748,7 @@ public static class Builder { // internals private String threadPoolName = defaultThreadPoolName(); + private String channelThreadPoolName = defaultChannelThreadPoolName(); private int httpClientCodecMaxInitialLineLength = defaultHttpClientCodecMaxInitialLineLength(); private int httpClientCodecMaxHeaderSize = defaultHttpClientCodecMaxHeaderSize(); private int httpClientCodecMaxChunkSize = defaultHttpClientCodecMaxChunkSize(); @@ -743,6 +760,7 @@ public static class Builder { private EventLoopGroup eventLoopGroup; private Timer nettyTimer; private ThreadFactory threadFactory; + private ThreadFactory channelThreadFactory; private Consumer httpAdditionalChannelInitializer; private Consumer wsAdditionalChannelInitializer; private ResponseBodyPartFactory responseBodyPartFactory = ResponseBodyPartFactory.EAGER; @@ -814,6 +832,7 @@ public Builder(AsyncHttpClientConfig config) { // internals threadPoolName = config.getThreadPoolName(); + channelThreadPoolName = config.getChannelThreadPoolName(); httpClientCodecMaxInitialLineLength = config.getHttpClientCodecMaxInitialLineLength(); httpClientCodecMaxHeaderSize = config.getHttpClientCodecMaxHeaderSize(); httpClientCodecMaxChunkSize = config.getHttpClientCodecMaxChunkSize(); @@ -824,6 +843,7 @@ public Builder(AsyncHttpClientConfig config) { allocator = config.getAllocator(); nettyTimer = config.getNettyTimer(); threadFactory = config.getThreadFactory(); + channelThreadFactory = config.getChannelThreadFactory(); httpAdditionalChannelInitializer = config.getHttpAdditionalChannelInitializer(); wsAdditionalChannelInitializer = config.getWsAdditionalChannelInitializer(); responseBodyPartFactory = config.getResponseBodyPartFactory(); @@ -1148,6 +1168,11 @@ public Builder setThreadPoolName(String threadPoolName) { return this; } + public Builder setChannelThreadPoolName(String channelThreadPoolName) { + this.channelThreadPoolName = channelThreadPoolName; + return this; + } + public Builder setHttpClientCodecMaxInitialLineLength(int httpClientCodecMaxInitialLineLength) { this.httpClientCodecMaxInitialLineLength = httpClientCodecMaxInitialLineLength; return this; @@ -1204,6 +1229,11 @@ public Builder setThreadFactory(ThreadFactory threadFactory) { return this; } + public Builder setChannelThreadFactory(ThreadFactory channelThreadFactory) { + this.channelThreadFactory = channelThreadFactory; + return this; + } + public Builder setHttpAdditionalChannelInitializer(Consumer httpAdditionalChannelInitializer) { this.httpAdditionalChannelInitializer = httpAdditionalChannelInitializer; return this; @@ -1291,6 +1321,7 @@ public DefaultAsyncHttpClientConfig build() { soSndBuf, soRcvBuf, threadPoolName, + channelThreadPoolName, httpClientCodecMaxInitialLineLength, httpClientCodecMaxHeaderSize, httpClientCodecMaxChunkSize, @@ -1304,6 +1335,7 @@ public DefaultAsyncHttpClientConfig build() { allocator, nettyTimer, threadFactory, + channelThreadFactory, httpAdditionalChannelInitializer, wsAdditionalChannelInitializer, responseBodyPartFactory, diff --git a/client/src/main/java/org/asynchttpclient/config/AsyncHttpClientConfigDefaults.java b/client/src/main/java/org/asynchttpclient/config/AsyncHttpClientConfigDefaults.java index fa073bc82f..795d3dfe9e 100644 --- a/client/src/main/java/org/asynchttpclient/config/AsyncHttpClientConfigDefaults.java +++ b/client/src/main/java/org/asynchttpclient/config/AsyncHttpClientConfigDefaults.java @@ -20,6 +20,7 @@ public final class AsyncHttpClientConfigDefaults { public static final String ASYNC_CLIENT_CONFIG_ROOT = "org.asynchttpclient."; public static final String THREAD_POOL_NAME_CONFIG = "threadPoolName"; + public static final String CHANNEL_THREAD_POOL_NAME_CONFIG = "channelThreadPoolName"; public static final String MAX_CONNECTIONS_CONFIG = "maxConnections"; public static final String MAX_CONNECTIONS_PER_HOST_CONFIG = "maxConnectionsPerHost"; public static final String ACQUIRE_FREE_CHANNEL_TIMEOUT = "acquireFreeChannelTimeout"; @@ -90,6 +91,10 @@ public static String defaultThreadPoolName() { return AsyncHttpClientConfigHelper.getAsyncHttpClientConfig().getString(ASYNC_CLIENT_CONFIG_ROOT + THREAD_POOL_NAME_CONFIG); } + public static String defaultChannelThreadPoolName() { + return AsyncHttpClientConfigHelper.getAsyncHttpClientConfig().getString(ASYNC_CLIENT_CONFIG_ROOT + CHANNEL_THREAD_POOL_NAME_CONFIG); + } + public static int defaultMaxConnections() { return AsyncHttpClientConfigHelper.getAsyncHttpClientConfig().getInt(ASYNC_CLIENT_CONFIG_ROOT + MAX_CONNECTIONS_CONFIG); } diff --git a/client/src/main/java/org/asynchttpclient/netty/channel/ChannelManager.java b/client/src/main/java/org/asynchttpclient/netty/channel/ChannelManager.java index 4488bb6514..d41ee4c1b7 100755 --- a/client/src/main/java/org/asynchttpclient/netty/channel/ChannelManager.java +++ b/client/src/main/java/org/asynchttpclient/netty/channel/ChannelManager.java @@ -119,7 +119,7 @@ public ChannelManager(final AsyncHttpClientConfig config, Timer nettyTimer) { handshakeTimeout = config.getHandshakeTimeout(); // check if external EventLoopGroup is defined - ThreadFactory threadFactory = config.getThreadFactory() != null ? config.getThreadFactory() : new DefaultThreadFactory(config.getThreadPoolName()); + ThreadFactory threadFactory = config.getChannelThreadFactory() != null ? config.getChannelThreadFactory() : new DefaultThreadFactory(config.getChannelThreadPoolName()); allowReleaseEventLoopGroup = config.getEventLoopGroup() == null; TransportFactory transportFactory; if (allowReleaseEventLoopGroup) { diff --git a/client/src/main/resources/org/asynchttpclient/config/ahc-default.properties b/client/src/main/resources/org/asynchttpclient/config/ahc-default.properties index c6fb355d75..cb876a2cbc 100644 --- a/client/src/main/resources/org/asynchttpclient/config/ahc-default.properties +++ b/client/src/main/resources/org/asynchttpclient/config/ahc-default.properties @@ -1,4 +1,5 @@ org.asynchttpclient.threadPoolName=AsyncHttpClient +org.asynchttpclient.channelThreadPoolName=AHC-Channel org.asynchttpclient.maxConnections=-1 org.asynchttpclient.maxConnectionsPerHost=-1 org.asynchttpclient.acquireFreeChannelTimeout=0 diff --git a/extras/typesafeconfig/src/main/java/org/asynchttpclient/extras/typesafeconfig/AsyncHttpClientTypesafeConfig.java b/extras/typesafeconfig/src/main/java/org/asynchttpclient/extras/typesafeconfig/AsyncHttpClientTypesafeConfig.java index 55c88ab251..9a00a842b8 100644 --- a/extras/typesafeconfig/src/main/java/org/asynchttpclient/extras/typesafeconfig/AsyncHttpClientTypesafeConfig.java +++ b/extras/typesafeconfig/src/main/java/org/asynchttpclient/extras/typesafeconfig/AsyncHttpClientTypesafeConfig.java @@ -59,6 +59,11 @@ public String getThreadPoolName() { return getStringOpt(THREAD_POOL_NAME_CONFIG).orElse(defaultThreadPoolName()); } + @Override + public String getChannelThreadPoolName() { + return getStringOpt(CHANNEL_THREAD_POOL_NAME_CONFIG).orElse(defaultChannelThreadPoolName()); + } + @Override public int getMaxConnections() { return getIntegerOpt(MAX_CONNECTIONS_CONFIG).orElse(defaultMaxConnections()); @@ -129,6 +134,11 @@ public ThreadFactory getThreadFactory() { return null; } + @Override + public ThreadFactory getChannelThreadFactory() { + return null; + } + @Override public ProxyServerSelector getProxyServerSelector() { return ProxyServerSelector.NO_PROXY_SELECTOR; diff --git a/extras/typesafeconfig/src/test/java/org/asynchttpclient/extras/typesafeconfig/AsyncHttpClientTypesafeConfigTest.java b/extras/typesafeconfig/src/test/java/org/asynchttpclient/extras/typesafeconfig/AsyncHttpClientTypesafeConfigTest.java index 1decc77490..e2270619dd 100644 --- a/extras/typesafeconfig/src/test/java/org/asynchttpclient/extras/typesafeconfig/AsyncHttpClientTypesafeConfigTest.java +++ b/extras/typesafeconfig/src/test/java/org/asynchttpclient/extras/typesafeconfig/AsyncHttpClientTypesafeConfigTest.java @@ -29,6 +29,10 @@ public void testThreadPoolName() { test(AsyncHttpClientTypesafeConfig::getThreadPoolName, "threadPoolName", "MyHttpClient", "AsyncHttpClient"); } + public void testChannelThreadPoolName() { + test(AsyncHttpClientTypesafeConfig::getChannelThreadPoolName, "channelThreadPoolName", "MyHttpClient", "AHC-Channel"); + } + public void testMaxTotalConnections() { test(AsyncHttpClientTypesafeConfig::getMaxConnections, "maxConnections", 100, -1); } From dcee7f8e8520d9aa39ed3ddd658c05da61c2a3b6 Mon Sep 17 00:00:00 2001 From: Mikhail Chernyakov Date: Thu, 2 Jan 2020 20:46:43 +0100 Subject: [PATCH 2/3] doc additions --- .../java/org/asynchttpclient/AsyncHttpClientConfig.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/src/main/java/org/asynchttpclient/AsyncHttpClientConfig.java b/client/src/main/java/org/asynchttpclient/AsyncHttpClientConfig.java index b2317d115a..86acd0944f 100644 --- a/client/src/main/java/org/asynchttpclient/AsyncHttpClientConfig.java +++ b/client/src/main/java/org/asynchttpclient/AsyncHttpClientConfig.java @@ -52,7 +52,7 @@ public interface AsyncHttpClientConfig { String getThreadPoolName(); /** - * Return the name of {@link org.asynchttpclient.netty.channel.ChannelManager}, which is used for thread naming and debugging. + * Return the name of threadPool for {@link org.asynchttpclient.netty.channel.ChannelManager}, which is used for thread naming and debugging. * * @return the name. */ @@ -157,9 +157,9 @@ public interface AsyncHttpClientConfig { ThreadFactory getThreadFactory(); /** - * Return the {@link java.util.concurrent.ThreadFactory} an {@link org.asynchttpclient.netty.channel.ChannelManager} use for handling channels. + * Return the {@link java.util.concurrent.ThreadFactory} an {@link org.asynchttpclient.netty.channel.ChannelManager} use for handling channels (I/O). * - * @return the {@link java.util.concurrent.ThreadFactory} an {@link org.asynchttpclient.netty.channel.ChannelManager} use for handling channels. + * @return the {@link java.util.concurrent.ThreadFactory} an {@link org.asynchttpclient.netty.channel.ChannelManager} use for handling channels (I/O). * If no {@link ThreadFactory} has been explicitly provided, this method will return null */ ThreadFactory getChannelThreadFactory(); From 6f12b3e8acd80c603717c87d1b5b4b4004eb9e06 Mon Sep 17 00:00:00 2001 From: Mikhail Chernyakov Date: Sun, 5 Jan 2020 19:52:45 +0100 Subject: [PATCH 3/3] doc fix --- .../main/java/org/asynchttpclient/AsyncHttpClientConfig.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/main/java/org/asynchttpclient/AsyncHttpClientConfig.java b/client/src/main/java/org/asynchttpclient/AsyncHttpClientConfig.java index 86acd0944f..85f35a4936 100644 --- a/client/src/main/java/org/asynchttpclient/AsyncHttpClientConfig.java +++ b/client/src/main/java/org/asynchttpclient/AsyncHttpClientConfig.java @@ -157,9 +157,9 @@ public interface AsyncHttpClientConfig { ThreadFactory getThreadFactory(); /** - * Return the {@link java.util.concurrent.ThreadFactory} an {@link org.asynchttpclient.netty.channel.ChannelManager} use for handling channels (I/O). + * Return the {@link java.util.concurrent.ThreadFactory} an {@link org.asynchttpclient.netty.channel.ChannelManager} use for handling I/O. * - * @return the {@link java.util.concurrent.ThreadFactory} an {@link org.asynchttpclient.netty.channel.ChannelManager} use for handling channels (I/O). + * @return the {@link java.util.concurrent.ThreadFactory} an {@link org.asynchttpclient.netty.channel.ChannelManager} use for handling I/O. * If no {@link ThreadFactory} has been explicitly provided, this method will return null */ ThreadFactory getChannelThreadFactory();