This is an automated email from the ASF dual-hosted git repository. liubao pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-java-chassis.git
commit 401846b6566a4caacb78221ca0cfffd185958aa6 Author: wujimin <[email protected]> AuthorDate: Sun Apr 22 04:10:58 2018 +0800 [SCB-486] ClientPoolManager support select ClientPool from special context. --- .../servicecomb/demo/perf/RedisClientUtils.java | 2 +- .../servicecomb/foundation/vertx/VertxUtils.java | 3 ++- .../foundation/vertx/client/ClientPoolFactory.java | 4 +++- .../foundation/vertx/client/ClientPoolManager.java | 24 ++++++++++++++-------- .../foundation/vertx/client/ClientVerticle.java | 3 ++- .../vertx/client/http/HttpClientPoolFactory.java | 4 +--- .../client/tcp/AbstractTcpClientPoolFactory.java | 3 +-- .../vertx/client/TestClientPoolManager.java | 10 ++++----- .../vertx/client/TestClientVerticle.java | 2 +- .../client/http/TestHttpClientPoolFactory.java | 4 +--- .../tcp/TestAbstractTcpClientPoolFactory.java | 4 +--- .../vertx/client/tcp/TestTcpClientConnection.java | 6 ++++++ 12 files changed, 39 insertions(+), 30 deletions(-) diff --git a/demo/perf/src/main/java/org/apache/servicecomb/demo/perf/RedisClientUtils.java b/demo/perf/src/main/java/org/apache/servicecomb/demo/perf/RedisClientUtils.java index b8e5add..0ce693a 100644 --- a/demo/perf/src/main/java/org/apache/servicecomb/demo/perf/RedisClientUtils.java +++ b/demo/perf/src/main/java/org/apache/servicecomb/demo/perf/RedisClientUtils.java @@ -40,7 +40,7 @@ public class RedisClientUtils { .setHost(PerfConfiguration.redisHost) .setPort(PerfConfiguration.redisPort) .setAuth(PerfConfiguration.redisPassword); - ClientPoolFactory<RedisClient> factory = () -> { + ClientPoolFactory<RedisClient> factory = (ctx) -> { return RedisClient.create(vertx, redisOptions); }; clientMgr = new ClientPoolManager<>(vertx, factory); diff --git a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/VertxUtils.java b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/VertxUtils.java index 8a31563..4aba612 100644 --- a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/VertxUtils.java +++ b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/VertxUtils.java @@ -37,6 +37,7 @@ import io.netty.buffer.ByteBuf; import io.vertx.core.AbstractVerticle; import io.vertx.core.Context; import io.vertx.core.DeploymentOptions; +import io.vertx.core.Verticle; import io.vertx.core.Vertx; import io.vertx.core.VertxOptions; import io.vertx.core.buffer.Buffer; @@ -88,7 +89,7 @@ public final class VertxUtils { } // deploy Verticle and wait for its success. do not call this method in event-loop thread - public static <VERTICLE extends AbstractVerticle> boolean blockDeploy(Vertx vertx, + public static <VERTICLE extends Verticle> boolean blockDeploy(Vertx vertx, Class<VERTICLE> cls, DeploymentOptions options) throws InterruptedException { Holder<Boolean> result = new Holder<>(); diff --git a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/client/ClientPoolFactory.java b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/client/ClientPoolFactory.java index 0445247..a8f38bd 100644 --- a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/client/ClientPoolFactory.java +++ b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/client/ClientPoolFactory.java @@ -17,6 +17,8 @@ package org.apache.servicecomb.foundation.vertx.client; +import io.vertx.core.Context; + public interface ClientPoolFactory<CLIENT_POOL> { - CLIENT_POOL createClientPool(); + CLIENT_POOL createClientPool(Context context); } diff --git a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/client/ClientPoolManager.java b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/client/ClientPoolManager.java index a79b86d..b867593 100644 --- a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/client/ClientPoolManager.java +++ b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/client/ClientPoolManager.java @@ -56,28 +56,36 @@ public class ClientPoolManager<CLIENT_POOL> { this.factory = factory; } - public CLIENT_POOL createClientPool() { - CLIENT_POOL pool = factory.createClientPool(); - addPool(pool); + public CLIENT_POOL createClientPool(Context context) { + CLIENT_POOL pool = factory.createClientPool(context); + addPool(context, pool); return pool; } - protected void addPool(CLIENT_POOL pool) { - Vertx.currentContext().put(id, pool); + protected void addPool(Context context, CLIENT_POOL pool) { + context.put(id, pool); pools.add(pool); } public CLIENT_POOL findClientPool(boolean sync) { + return findClientPool(sync, null); + } + + public CLIENT_POOL findClientPool(boolean sync, Context targetContext) { if (sync) { return findThreadBindClientPool(); } // reactive mode - return findByContext(); + return findByContext(targetContext); } protected CLIENT_POOL findByContext() { - Context currentContext = Vertx.currentContext(); + return findByContext(null); + } + + protected CLIENT_POOL findByContext(Context targetContext) { + Context currentContext = targetContext != null ? targetContext : Vertx.currentContext(); if (currentContext != null && currentContext.owner() == vertx && currentContext.isEventLoopContext()) { @@ -89,7 +97,7 @@ public class ClientPoolManager<CLIENT_POOL> { // this will make "client.thread-count" bigger than which in microservice.yaml // maybe it's better to remove "client.thread-count", just use "rest/highway.thread-count" - return createClientPool(); + return createClientPool(currentContext); } // not in correct context: diff --git a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/client/ClientVerticle.java b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/client/ClientVerticle.java index 19e972b..69044ae 100644 --- a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/client/ClientVerticle.java +++ b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/client/ClientVerticle.java @@ -24,6 +24,7 @@ import io.vertx.core.AbstractVerticle; public class ClientVerticle<CLIENT_POOL> extends AbstractVerticle { private static final Logger LOGGER = LoggerFactory.getLogger(ClientVerticle.class); + public static final String CLIENT_MGR = "clientMgr"; @SuppressWarnings("unchecked") @@ -31,7 +32,7 @@ public class ClientVerticle<CLIENT_POOL> extends AbstractVerticle { public void start() throws Exception { try { ClientPoolManager<CLIENT_POOL> clientMgr = (ClientPoolManager<CLIENT_POOL>) config().getValue(CLIENT_MGR); - clientMgr.createClientPool(); + clientMgr.createClientPool(context); } catch (Throwable e) { // vert.x got some states that not print error and execute call back in VertexUtils.blockDeploy, we add a log our self. LOGGER.error("", e); diff --git a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/client/http/HttpClientPoolFactory.java b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/client/http/HttpClientPoolFactory.java index 945e872..a6b1f60 100644 --- a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/client/http/HttpClientPoolFactory.java +++ b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/client/http/HttpClientPoolFactory.java @@ -20,7 +20,6 @@ package org.apache.servicecomb.foundation.vertx.client.http; import org.apache.servicecomb.foundation.vertx.client.ClientPoolFactory; import io.vertx.core.Context; -import io.vertx.core.Vertx; import io.vertx.core.http.HttpClient; import io.vertx.core.http.HttpClientOptions; @@ -33,8 +32,7 @@ public class HttpClientPoolFactory implements ClientPoolFactory<HttpClientWithCo } @Override - public HttpClientWithContext createClientPool() { - Context context = Vertx.currentContext(); + public HttpClientWithContext createClientPool(Context context) { HttpClient httpClient = context.owner().createHttpClient(httpClientOptions); return new HttpClientWithContext(httpClient, context); diff --git a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/client/tcp/AbstractTcpClientPoolFactory.java b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/client/tcp/AbstractTcpClientPoolFactory.java index e87c283..3d1b298 100644 --- a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/client/tcp/AbstractTcpClientPoolFactory.java +++ b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/client/tcp/AbstractTcpClientPoolFactory.java @@ -32,8 +32,7 @@ public abstract class AbstractTcpClientPoolFactory<CLIENT_POOL> implements Clien } @Override - public CLIENT_POOL createClientPool() { - Context context = Vertx.currentContext(); + public CLIENT_POOL createClientPool(Context context) { Vertx vertx = context.owner(); NetClientWrapper netClientWrapper = new NetClientWrapper(vertx, normalClientConfig, sslClientConfig); diff --git a/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/client/TestClientPoolManager.java b/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/client/TestClientPoolManager.java index 884aecc..4548e5b 100644 --- a/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/client/TestClientPoolManager.java +++ b/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/client/TestClientPoolManager.java @@ -86,14 +86,12 @@ public class TestClientPoolManager { public void createClientPool(@Mocked HttpClientWithContext pool) { new Expectations(VertxImpl.class) { { - factory.createClientPool(); + factory.createClientPool(context); result = pool; - VertxImpl.context(); - result = context; } }; - Assert.assertSame(pool, poolMgr.createClientPool()); + Assert.assertSame(pool, poolMgr.createClientPool(context)); Assert.assertSame(pool, context.get(id)); Assert.assertThat(pools, Matchers.contains(pool)); } @@ -104,7 +102,7 @@ public class TestClientPoolManager { { poolMgr.findThreadBindClientPool(); result = pool1; - poolMgr.findByContext(); + poolMgr.findByContext(null); result = pool2; } }; @@ -148,7 +146,7 @@ public class TestClientPoolManager { new Expectations(VertxImpl.class) { { - factory.createClientPool(); + factory.createClientPool(context); result = new HttpClientWithContext(null, null); VertxImpl.context(); result = context; diff --git a/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/client/TestClientVerticle.java b/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/client/TestClientVerticle.java index 0c018fe..6f76372 100644 --- a/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/client/TestClientVerticle.java +++ b/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/client/TestClientVerticle.java @@ -38,7 +38,7 @@ public class TestClientVerticle { AtomicInteger count = new AtomicInteger(); ClientPoolManager<HttpClientWithContext> clientMgr = new MockUp<ClientPoolManager<HttpClientWithContext>>() { @Mock - HttpClientWithContext createClientPool() { + HttpClientWithContext createClientPool(Context context) { count.incrementAndGet(); return null; } diff --git a/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/client/http/TestHttpClientPoolFactory.java b/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/client/http/TestHttpClientPoolFactory.java index 7f0f7eb..08b9a32 100644 --- a/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/client/http/TestHttpClientPoolFactory.java +++ b/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/client/http/TestHttpClientPoolFactory.java @@ -36,15 +36,13 @@ public class TestHttpClientPoolFactory { public void createClientPool(@Mocked Vertx vertx, @Mocked Context context, @Mocked HttpClient httpClient) { new Expectations(VertxImpl.class) { { - VertxImpl.context(); - result = context; context.owner(); result = vertx; vertx.createHttpClient(httpClientOptions); result = httpClient; } }; - HttpClientWithContext pool = factory.createClientPool(); + HttpClientWithContext pool = factory.createClientPool(context); Assert.assertSame(context, pool.context()); Assert.assertSame(httpClient, pool.getHttpClient()); diff --git a/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/client/tcp/TestAbstractTcpClientPoolFactory.java b/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/client/tcp/TestAbstractTcpClientPoolFactory.java index 5c868ff..a95aa3f 100644 --- a/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/client/tcp/TestAbstractTcpClientPoolFactory.java +++ b/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/client/tcp/TestAbstractTcpClientPoolFactory.java @@ -36,13 +36,11 @@ public class TestAbstractTcpClientPoolFactory { public void createClientPool(@Mocked Vertx vertx, @Mocked Context context) { new Expectations(VertxImpl.class) { { - VertxImpl.context(); - result = context; context.owner(); result = vertx; } }; - TcpClientConnectionPool pool = factory.createClientPool(); + TcpClientConnectionPool pool = factory.createClientPool(context); Assert.assertSame(normalClientConfig, pool.netClientWrapper.getClientConfig(false)); Assert.assertSame(sslClientConfig, pool.netClientWrapper.getClientConfig(true)); diff --git a/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/client/tcp/TestTcpClientConnection.java b/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/client/tcp/TestTcpClientConnection.java index 9a7877a..d50ecb8 100644 --- a/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/client/tcp/TestTcpClientConnection.java +++ b/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/client/tcp/TestTcpClientConnection.java @@ -100,6 +100,12 @@ public class TestTcpClientConnection { result = byteBuf; } }; + + new MockUp<Context>(context) { + @Mock + void runOnContext(Handler<Void> action) { + } + }; tcpClientConnection.send(tcpClientPackage, ar -> { }); -- To stop receiving notification emails like this one, please contact [email protected].
