This is an automated email from the ASF dual-hosted git repository. wujimin pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git
The following commit(s) were added to refs/heads/master by this push: new 7c48e33 [SCB-1239] close thread after finish unit test case at once. 7c48e33 is described below commit 7c48e33f1ba2495a0b6d1b0399e42aad2792a8f7 Author: wujimin <wuji...@huawei.com> AuthorDate: Thu Apr 4 10:59:53 2019 +0800 [SCB-1239] close thread after finish unit test case at once. --- .../core/transport/TransportVertxFactory.java | 37 +++++++++++++++------- .../core/executor/TestThreadPoolExecutorEx.java | 19 +++++------ .../core/transport/TestAbstractTransport.java | 2 +- .../servicecomb/foundation/vertx/VertxUtils.java | 21 +++++++++++- .../foundation/vertx/TestVertxUtils.java | 6 ++-- .../servicecomb/faultinjection/AbortFaultTest.java | 2 +- .../servicecomb/faultinjection/DelayFaultTest.java | 2 +- .../faultinjection/TestFaultInjectHandler.java | 2 +- .../transport/highway/TestHighwayTransport.java | 19 +++++++++-- 9 files changed, 78 insertions(+), 32 deletions(-) diff --git a/core/src/main/java/org/apache/servicecomb/core/transport/TransportVertxFactory.java b/core/src/main/java/org/apache/servicecomb/core/transport/TransportVertxFactory.java index d4e96d3..c2227fb 100644 --- a/core/src/main/java/org/apache/servicecomb/core/transport/TransportVertxFactory.java +++ b/core/src/main/java/org/apache/servicecomb/core/transport/TransportVertxFactory.java @@ -22,27 +22,42 @@ import org.apache.servicecomb.foundation.vertx.metrics.MetricsOptionsEx; import io.vertx.core.Vertx; import io.vertx.core.VertxOptions; +import io.vertx.core.shareddata.Shareable; public class TransportVertxFactory { - private VertxOptions vertxOptions = new VertxOptions(); + static class TransportVertxInfo implements Shareable { + public VertxOptions vertxOptions = new VertxOptions(); - private DefaultVertxMetricsFactory metricsFactory = new DefaultVertxMetricsFactory(); + public DefaultVertxMetricsFactory metricsFactory = new DefaultVertxMetricsFactory(); - private MetricsOptionsEx metricsOptionsEx = (MetricsOptionsEx) metricsFactory.newOptions(); + public MetricsOptionsEx metricsOptionsEx = (MetricsOptionsEx) metricsFactory.newOptions(); - private Vertx transportVertx; - - public TransportVertxFactory() { - vertxOptions.setMetricsOptions(metricsOptionsEx); - transportVertx = VertxUtils.getOrCreateVertxByName("transport", vertxOptions); - metricsFactory.setVertx(transportVertx, vertxOptions); + public TransportVertxInfo() { + vertxOptions.setMetricsOptions(metricsOptionsEx); + } } + private static final String LOCAL_MAP_NAME = "scb"; + + private static final String INFO = "transport-vertx-info"; + public DefaultVertxMetricsFactory getMetricsFactory() { - return metricsFactory; + TransportVertxInfo info = (TransportVertxInfo) getTransportVertx().sharedData().getLocalMap(LOCAL_MAP_NAME) + .get(INFO); + return info.metricsFactory; } public Vertx getTransportVertx() { - return transportVertx; + return VertxUtils.getVertxMap().computeIfAbsent("transport", this::createTransportVertx); + } + + private Vertx createTransportVertx(String name) { + TransportVertxInfo info = new TransportVertxInfo(); + + Vertx vertx = VertxUtils.init(info.vertxOptions); + info.metricsFactory.setVertx(vertx, info.vertxOptions); + vertx.sharedData().getLocalMap(LOCAL_MAP_NAME).put(INFO, info); + + return vertx; } } diff --git a/core/src/test/java/org/apache/servicecomb/core/executor/TestThreadPoolExecutorEx.java b/core/src/test/java/org/apache/servicecomb/core/executor/TestThreadPoolExecutorEx.java index a2567e4..163fbb9 100644 --- a/core/src/test/java/org/apache/servicecomb/core/executor/TestThreadPoolExecutorEx.java +++ b/core/src/test/java/org/apache/servicecomb/core/executor/TestThreadPoolExecutorEx.java @@ -17,6 +17,8 @@ package org.apache.servicecomb.core.executor; import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.TimeUnit; @@ -27,24 +29,19 @@ public class TestThreadPoolExecutorEx { static class TestTask implements Runnable { CountDownLatch notify = new CountDownLatch(1); - CountDownLatch wait = new CountDownLatch(1); + Future<?> future; - public void quit() { + public void quit() throws ExecutionException, InterruptedException { notify.countDown(); - try { - wait.await(); - } catch (InterruptedException e) { - e.printStackTrace(); - } + future.get(); } @Override public void run() { try { notify.await(); - wait.countDown(); } catch (InterruptedException e) { - e.printStackTrace(); + throw new IllegalStateException(e); } } } @@ -54,12 +51,12 @@ public class TestThreadPoolExecutorEx { public TestTask submitTask() { TestTask task = new TestTask(); - executorEx.execute(task); + task.future = executorEx.submit(task); return task; } @Test - public void schedule() { + public void schedule() throws ExecutionException, InterruptedException { // init Assert.assertEquals(0, executorEx.getPoolSize()); Assert.assertEquals(0, executorEx.getRejectedCount()); diff --git a/core/src/test/java/org/apache/servicecomb/core/transport/TestAbstractTransport.java b/core/src/test/java/org/apache/servicecomb/core/transport/TestAbstractTransport.java index eeff175..2d3658a 100644 --- a/core/src/test/java/org/apache/servicecomb/core/transport/TestAbstractTransport.java +++ b/core/src/test/java/org/apache/servicecomb/core/transport/TestAbstractTransport.java @@ -84,7 +84,7 @@ public class TestAbstractTransport { @AfterClass public static void classTeardown() { - VertxUtils.closeVertxByName("transport"); + VertxUtils.blockCloseVertxByName("transport"); } @Test 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 2082ef0..06484be 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 @@ -216,7 +216,26 @@ public final class VertxUtils { try { future.get(); } catch (Throwable e) { - LOGGER.error("Failed to close vertx {}.", name, e); + LOGGER.error("Failed to wait close vertx {}.", name, e); + } + } + + public static void blockCloseVertx(Vertx vertx) { + CountDownLatch latch = new CountDownLatch(1); + vertx.close(ar -> { + if (ar.succeeded()) { + LOGGER.info("Success to close vertx {}.", vertx); + } else { + LOGGER.info("Failed to close vertx {}.", vertx); + } + + latch.countDown(); + }); + + try { + latch.await(); + } catch (InterruptedException e) { + LOGGER.info("Failed to wait close vertx {}.", vertx); } } } diff --git a/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/TestVertxUtils.java b/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/TestVertxUtils.java index ee800d2..3da853d 100644 --- a/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/TestVertxUtils.java +++ b/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/TestVertxUtils.java @@ -28,6 +28,7 @@ import javax.xml.ws.Holder; import org.apache.commons.io.FileUtils; import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils; import org.apache.servicecomb.foundation.vertx.stream.BufferInputStream; +import org.junit.AfterClass; import org.junit.Assert; import org.junit.Test; @@ -39,7 +40,6 @@ import io.vertx.core.buffer.Buffer; import io.vertx.core.file.impl.FileResolver; public class TestVertxUtils { - @Test public void testGetOrCreateVertx() throws InterruptedException { Vertx vertx = VertxUtils.getOrCreateVertxByName("ut", null); @@ -86,7 +86,7 @@ public class TestVertxUtils { public void testVertxUtilsInitNullOptions() { Vertx vertx = VertxUtils.init(null); Assert.assertNotEquals(null, vertx); - vertx.close(); + VertxUtils.blockCloseVertx(vertx); } @Test @@ -96,7 +96,7 @@ public class TestVertxUtils { Vertx vertx = VertxUtils.init(oOptions); Assert.assertNotEquals(null, vertx); - vertx.close(); + VertxUtils.blockCloseVertx(vertx); } @Test diff --git a/handlers/handler-fault-injection/src/test/java/org/apache/servicecomb/faultinjection/AbortFaultTest.java b/handlers/handler-fault-injection/src/test/java/org/apache/servicecomb/faultinjection/AbortFaultTest.java index da606e0..ceddd85 100644 --- a/handlers/handler-fault-injection/src/test/java/org/apache/servicecomb/faultinjection/AbortFaultTest.java +++ b/handlers/handler-fault-injection/src/test/java/org/apache/servicecomb/faultinjection/AbortFaultTest.java @@ -70,7 +70,7 @@ public class AbortFaultTest { @AfterClass public static void classTeardown() { - VertxUtils.closeVertxByName("faultinjectionTest"); + VertxUtils.blockCloseVertxByName("faultinjectionTest"); } @Test diff --git a/handlers/handler-fault-injection/src/test/java/org/apache/servicecomb/faultinjection/DelayFaultTest.java b/handlers/handler-fault-injection/src/test/java/org/apache/servicecomb/faultinjection/DelayFaultTest.java index 7b5452d..dcaa99e 100644 --- a/handlers/handler-fault-injection/src/test/java/org/apache/servicecomb/faultinjection/DelayFaultTest.java +++ b/handlers/handler-fault-injection/src/test/java/org/apache/servicecomb/faultinjection/DelayFaultTest.java @@ -71,7 +71,7 @@ public class DelayFaultTest { @AfterClass public static void classTeardown() { - VertxUtils.closeVertxByName("faultinjectionTest"); + VertxUtils.blockCloseVertxByName("faultinjectionTest"); } @Test diff --git a/handlers/handler-fault-injection/src/test/java/org/apache/servicecomb/faultinjection/TestFaultInjectHandler.java b/handlers/handler-fault-injection/src/test/java/org/apache/servicecomb/faultinjection/TestFaultInjectHandler.java index bc5585c..86727b0 100644 --- a/handlers/handler-fault-injection/src/test/java/org/apache/servicecomb/faultinjection/TestFaultInjectHandler.java +++ b/handlers/handler-fault-injection/src/test/java/org/apache/servicecomb/faultinjection/TestFaultInjectHandler.java @@ -100,7 +100,7 @@ public class TestFaultInjectHandler { @AfterClass public static void classTeardown() { - VertxUtils.closeVertxByName("faultinjectionTest"); + VertxUtils.blockCloseVertxByName("faultinjectionTest"); } /** diff --git a/transports/transport-highway/src/test/java/org/apache/servicecomb/transport/highway/TestHighwayTransport.java b/transports/transport-highway/src/test/java/org/apache/servicecomb/transport/highway/TestHighwayTransport.java index a367815..63e493e 100644 --- a/transports/transport-highway/src/test/java/org/apache/servicecomb/transport/highway/TestHighwayTransport.java +++ b/transports/transport-highway/src/test/java/org/apache/servicecomb/transport/highway/TestHighwayTransport.java @@ -27,17 +27,34 @@ import org.apache.servicecomb.core.definition.OperationMeta; import org.apache.servicecomb.foundation.common.net.URIEndpointObject; import org.apache.servicecomb.foundation.vertx.VertxUtils; import org.apache.servicecomb.swagger.invocation.AsyncResponse; +import org.junit.AfterClass; import org.junit.Assert; +import org.junit.BeforeClass; import org.junit.Test; import org.mockito.Mockito; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import mockit.Mock; import mockit.MockUp; public class TestHighwayTransport { + private static final Logger LOGGER = LoggerFactory.getLogger(TestHighwayTransport.class); private HighwayTransport transport = new HighwayTransport(); + @BeforeClass + public static void setup() { + VertxUtils.blockCloseVertxByName("transport"); + Thread.getAllStackTraces().keySet().forEach(t->LOGGER.info("before: {}", t.getName())); + } + + @AfterClass + public static void teardown() { + VertxUtils.blockCloseVertxByName("transport"); + Thread.getAllStackTraces().keySet().forEach(t->LOGGER.info("after: {}", t.getName())); + } + @Test public void testGetInstance() { Assert.assertNotNull(transport); @@ -50,8 +67,6 @@ public class TestHighwayTransport { transport.init(); } catch (Exception e) { status = false; - } finally { - VertxUtils.blockCloseVertxByName("transport"); } Assert.assertTrue(status);