Search in sources :

Example 6 with ProtocolSslContextSpec

use of reactor.netty.tcp.SslProvider.ProtocolSslContextSpec in project reactor-netty by reactor.

the class HttpMetricsHandlerTests method testUriTagValueFunctionNotSharedForClient.

/**
 * https://github.com/reactor/reactor-netty/issues/1559
 */
@ParameterizedTest
@MethodSource("httpCompatibleProtocols")
void testUriTagValueFunctionNotSharedForClient(HttpProtocol[] serverProtocols, HttpProtocol[] clientProtocols, @Nullable ProtocolSslContextSpec serverCtx, @Nullable ProtocolSslContextSpec clientCtx) throws Exception {
    disposableServer = customizeServerOptions(httpServer, serverCtx, serverProtocols).metrics(true, s -> {
        if ("/1".equals(s)) {
            return "testUriTagValueFunctionNotShared_1";
        } else {
            return "testUriTagValueFunctionNotShared_2";
        }
    }).bindNow();
    AtomicReference<SocketAddress> serverAddress = new AtomicReference<>();
    httpClient = customizeClientOptions(httpClient, clientCtx, clientProtocols).doAfterRequest((req, conn) -> serverAddress.set(conn.channel().remoteAddress()));
    CountDownLatch latch1 = new CountDownLatch(1);
    httpClient.doOnResponse((res, conn) -> conn.channel().closeFuture().addListener(f -> latch1.countDown())).metrics(true, s -> "testUriTagValueFunctionNotShared_1").post().uri("/1").send(body).responseContent().aggregate().asString().as(StepVerifier::create).expectNext("Hello World!").expectComplete().verify(Duration.ofSeconds(30));
    assertThat(latch1.await(30, TimeUnit.SECONDS)).as("latch await").isTrue();
    InetSocketAddress sa = (InetSocketAddress) serverAddress.get();
    Thread.sleep(1000);
    checkExpectationsExisting("testUriTagValueFunctionNotShared_1", sa.getHostString() + ":" + sa.getPort(), 1, serverCtx != null);
    CountDownLatch latch2 = new CountDownLatch(1);
    httpClient.doOnResponse((res, conn) -> conn.channel().closeFuture().addListener(f -> latch2.countDown())).metrics(true, s -> "testUriTagValueFunctionNotShared_2").post().uri("/2").send(body).responseContent().aggregate().asString().as(StepVerifier::create).expectNext("Hello World!").expectComplete().verify(Duration.ofSeconds(30));
    assertThat(latch1.await(30, TimeUnit.SECONDS)).as("latch await").isTrue();
    sa = (InetSocketAddress) serverAddress.get();
    Thread.sleep(1000);
    checkExpectationsExisting("testUriTagValueFunctionNotShared_2", sa.getHostString() + ":" + sa.getPort(), 2, serverCtx != null);
}
Also used : BeforeEach(org.junit.jupiter.api.BeforeEach) StepVerifier(reactor.test.StepVerifier) SocketAddress(java.net.SocketAddress) ContextView(reactor.util.context.ContextView) ContextAwareHttpServerMetricsRecorder(reactor.netty.http.server.ContextAwareHttpServerMetricsRecorder) Assertions.assertThat(org.assertj.core.api.Assertions.assertThat) BaseHttpTest(reactor.netty.BaseHttpTest) DATA_SENT_TIME(reactor.netty.Metrics.DATA_SENT_TIME) Counter(io.micrometer.api.instrument.Counter) Tags(io.micrometer.api.instrument.Tags) ProtocolSslContextSpec(reactor.netty.tcp.SslProvider.ProtocolSslContextSpec) BeforeAll(org.junit.jupiter.api.BeforeAll) ByteBufFlux(reactor.netty.ByteBufFlux) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Duration(java.time.Duration) MethodSource(org.junit.jupiter.params.provider.MethodSource) Timer(io.micrometer.api.instrument.Timer) ERRORS(reactor.netty.Metrics.ERRORS) RESPONSE_TIME(reactor.netty.Metrics.RESPONSE_TIME) Context(reactor.util.context.Context) TLS_HANDSHAKE_TIME(reactor.netty.Metrics.TLS_HANDSHAKE_TIME) MeterRegistryAssert(io.micrometer.core.tck.MeterRegistryAssert) Arguments(org.junit.jupiter.params.provider.Arguments) InetSocketAddress(java.net.InetSocketAddress) DistributionSummary(io.micrometer.api.instrument.DistributionSummary) HTTP_CLIENT_PREFIX(reactor.netty.Metrics.HTTP_CLIENT_PREFIX) Test(org.junit.jupiter.api.Test) STATUS(reactor.netty.Metrics.STATUS) ContextAwareHttpClientMetricsRecorder(reactor.netty.http.client.ContextAwareHttpClientMetricsRecorder) CountDownLatch(java.util.concurrent.CountDownLatch) HttpServer(reactor.netty.http.server.HttpServer) Stream(java.util.stream.Stream) Named(org.junit.jupiter.api.Named) CONNECT_TIME(reactor.netty.Metrics.CONNECT_TIME) Gauge(io.micrometer.api.instrument.Gauge) HttpClient(reactor.netty.http.client.HttpClient) SimpleMeterRegistry(io.micrometer.api.instrument.simple.SimpleMeterRegistry) REMOTE_ADDRESS(reactor.netty.Metrics.REMOTE_ADDRESS) HTTP_SERVER_PREFIX(reactor.netty.Metrics.HTTP_SERVER_PREFIX) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) Nullable(reactor.util.annotation.Nullable) AtomicReference(java.util.concurrent.atomic.AtomicReference) Function(java.util.function.Function) InsecureTrustManagerFactory(io.netty.handler.ssl.util.InsecureTrustManagerFactory) ByteBuf(io.netty.buffer.ByteBuf) DATA_SENT(reactor.netty.Metrics.DATA_SENT) METHOD(reactor.netty.Metrics.METHOD) DATA_RECEIVED_TIME(reactor.netty.Metrics.DATA_RECEIVED_TIME) Metrics.formatSocketAddress(reactor.netty.Metrics.formatSocketAddress) CONNECTIONS_ACTIVE(reactor.netty.Metrics.CONNECTIONS_ACTIVE) CONNECTIONS_TOTAL(reactor.netty.Metrics.CONNECTIONS_TOTAL) SelfSignedCertificate(io.netty.handler.ssl.util.SelfSignedCertificate) HttpServerMetricsRecorder(reactor.netty.http.server.HttpServerMetricsRecorder) Mono(reactor.core.publisher.Mono) CertificateException(java.security.cert.CertificateException) LOCAL_ADDRESS(reactor.netty.Metrics.LOCAL_ADDRESS) TimeUnit(java.util.concurrent.TimeUnit) Flux(reactor.core.publisher.Flux) AfterEach(org.junit.jupiter.api.AfterEach) ParameterizedTest(org.junit.jupiter.params.ParameterizedTest) SslProvider(io.netty.handler.ssl.SslProvider) MeterRegistry(io.micrometer.api.instrument.MeterRegistry) Metrics(io.micrometer.api.instrument.Metrics) DATA_RECEIVED(reactor.netty.Metrics.DATA_RECEIVED) ConnectionProvider(reactor.netty.resources.ConnectionProvider) URI(reactor.netty.Metrics.URI) InetSocketAddress(java.net.InetSocketAddress) AtomicReference(java.util.concurrent.atomic.AtomicReference) SocketAddress(java.net.SocketAddress) InetSocketAddress(java.net.InetSocketAddress) Metrics.formatSocketAddress(reactor.netty.Metrics.formatSocketAddress) CountDownLatch(java.util.concurrent.CountDownLatch) ParameterizedTest(org.junit.jupiter.params.ParameterizedTest) MethodSource(org.junit.jupiter.params.provider.MethodSource)

Example 7 with ProtocolSslContextSpec

use of reactor.netty.tcp.SslProvider.ProtocolSslContextSpec in project reactor-netty by reactor.

the class HttpMetricsHandlerTests method testNonExistingEndpoint.

@ParameterizedTest
@MethodSource("httpCompatibleProtocols")
void testNonExistingEndpoint(HttpProtocol[] serverProtocols, HttpProtocol[] clientProtocols, @Nullable ProtocolSslContextSpec serverCtx, @Nullable ProtocolSslContextSpec clientCtx) throws Exception {
    disposableServer = customizeServerOptions(httpServer, serverCtx, serverProtocols).bindNow();
    AtomicReference<SocketAddress> serverAddress = new AtomicReference<>();
    httpClient = customizeClientOptions(httpClient, clientCtx, clientProtocols).doAfterRequest((req, conn) -> serverAddress.set(conn.channel().remoteAddress()));
    CountDownLatch latch1 = new CountDownLatch(1);
    StepVerifier.create(httpClient.doOnResponse((res, conn) -> conn.channel().closeFuture().addListener(f -> latch1.countDown())).headers(h -> h.add("Connection", "close")).get().uri("/3").responseContent().aggregate().asString()).expectComplete().verify(Duration.ofSeconds(30));
    assertThat(latch1.await(30, TimeUnit.SECONDS)).as("latch await").isTrue();
    InetSocketAddress sa = (InetSocketAddress) serverAddress.get();
    Thread.sleep(1000);
    checkExpectationsNonExisting(sa.getHostString() + ":" + sa.getPort(), 1, serverCtx != null);
    CountDownLatch latch2 = new CountDownLatch(1);
    StepVerifier.create(httpClient.doOnResponse((res, conn) -> conn.channel().closeFuture().addListener(f -> latch2.countDown())).headers(h -> h.add("Connection", "close")).get().uri("/3").responseContent().aggregate().asString()).expectComplete().verify(Duration.ofSeconds(30));
    assertThat(latch2.await(30, TimeUnit.SECONDS)).as("latch await").isTrue();
    sa = (InetSocketAddress) serverAddress.get();
    Thread.sleep(1000);
    checkExpectationsNonExisting(sa.getHostString() + ":" + sa.getPort(), 2, serverCtx != null);
}
Also used : BeforeEach(org.junit.jupiter.api.BeforeEach) StepVerifier(reactor.test.StepVerifier) SocketAddress(java.net.SocketAddress) ContextView(reactor.util.context.ContextView) ContextAwareHttpServerMetricsRecorder(reactor.netty.http.server.ContextAwareHttpServerMetricsRecorder) Assertions.assertThat(org.assertj.core.api.Assertions.assertThat) BaseHttpTest(reactor.netty.BaseHttpTest) DATA_SENT_TIME(reactor.netty.Metrics.DATA_SENT_TIME) Counter(io.micrometer.api.instrument.Counter) Tags(io.micrometer.api.instrument.Tags) ProtocolSslContextSpec(reactor.netty.tcp.SslProvider.ProtocolSslContextSpec) BeforeAll(org.junit.jupiter.api.BeforeAll) ByteBufFlux(reactor.netty.ByteBufFlux) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Duration(java.time.Duration) MethodSource(org.junit.jupiter.params.provider.MethodSource) Timer(io.micrometer.api.instrument.Timer) ERRORS(reactor.netty.Metrics.ERRORS) RESPONSE_TIME(reactor.netty.Metrics.RESPONSE_TIME) Context(reactor.util.context.Context) TLS_HANDSHAKE_TIME(reactor.netty.Metrics.TLS_HANDSHAKE_TIME) MeterRegistryAssert(io.micrometer.core.tck.MeterRegistryAssert) Arguments(org.junit.jupiter.params.provider.Arguments) InetSocketAddress(java.net.InetSocketAddress) DistributionSummary(io.micrometer.api.instrument.DistributionSummary) HTTP_CLIENT_PREFIX(reactor.netty.Metrics.HTTP_CLIENT_PREFIX) Test(org.junit.jupiter.api.Test) STATUS(reactor.netty.Metrics.STATUS) ContextAwareHttpClientMetricsRecorder(reactor.netty.http.client.ContextAwareHttpClientMetricsRecorder) CountDownLatch(java.util.concurrent.CountDownLatch) HttpServer(reactor.netty.http.server.HttpServer) Stream(java.util.stream.Stream) Named(org.junit.jupiter.api.Named) CONNECT_TIME(reactor.netty.Metrics.CONNECT_TIME) Gauge(io.micrometer.api.instrument.Gauge) HttpClient(reactor.netty.http.client.HttpClient) SimpleMeterRegistry(io.micrometer.api.instrument.simple.SimpleMeterRegistry) REMOTE_ADDRESS(reactor.netty.Metrics.REMOTE_ADDRESS) HTTP_SERVER_PREFIX(reactor.netty.Metrics.HTTP_SERVER_PREFIX) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) Nullable(reactor.util.annotation.Nullable) AtomicReference(java.util.concurrent.atomic.AtomicReference) Function(java.util.function.Function) InsecureTrustManagerFactory(io.netty.handler.ssl.util.InsecureTrustManagerFactory) ByteBuf(io.netty.buffer.ByteBuf) DATA_SENT(reactor.netty.Metrics.DATA_SENT) METHOD(reactor.netty.Metrics.METHOD) DATA_RECEIVED_TIME(reactor.netty.Metrics.DATA_RECEIVED_TIME) Metrics.formatSocketAddress(reactor.netty.Metrics.formatSocketAddress) CONNECTIONS_ACTIVE(reactor.netty.Metrics.CONNECTIONS_ACTIVE) CONNECTIONS_TOTAL(reactor.netty.Metrics.CONNECTIONS_TOTAL) SelfSignedCertificate(io.netty.handler.ssl.util.SelfSignedCertificate) HttpServerMetricsRecorder(reactor.netty.http.server.HttpServerMetricsRecorder) Mono(reactor.core.publisher.Mono) CertificateException(java.security.cert.CertificateException) LOCAL_ADDRESS(reactor.netty.Metrics.LOCAL_ADDRESS) TimeUnit(java.util.concurrent.TimeUnit) Flux(reactor.core.publisher.Flux) AfterEach(org.junit.jupiter.api.AfterEach) ParameterizedTest(org.junit.jupiter.params.ParameterizedTest) SslProvider(io.netty.handler.ssl.SslProvider) MeterRegistry(io.micrometer.api.instrument.MeterRegistry) Metrics(io.micrometer.api.instrument.Metrics) DATA_RECEIVED(reactor.netty.Metrics.DATA_RECEIVED) ConnectionProvider(reactor.netty.resources.ConnectionProvider) URI(reactor.netty.Metrics.URI) InetSocketAddress(java.net.InetSocketAddress) AtomicReference(java.util.concurrent.atomic.AtomicReference) SocketAddress(java.net.SocketAddress) InetSocketAddress(java.net.InetSocketAddress) Metrics.formatSocketAddress(reactor.netty.Metrics.formatSocketAddress) CountDownLatch(java.util.concurrent.CountDownLatch) ParameterizedTest(org.junit.jupiter.params.ParameterizedTest) MethodSource(org.junit.jupiter.params.provider.MethodSource)

Example 8 with ProtocolSslContextSpec

use of reactor.netty.tcp.SslProvider.ProtocolSslContextSpec in project reactor-netty by reactor.

the class HttpMetricsHandlerTests method testServerConnectionsMicrometer.

@ParameterizedTest
@MethodSource("httpCompatibleProtocols")
void testServerConnectionsMicrometer(HttpProtocol[] serverProtocols, HttpProtocol[] clientProtocols, @Nullable ProtocolSslContextSpec serverCtx, @Nullable ProtocolSslContextSpec clientCtx) throws Exception {
    disposableServer = customizeServerOptions(httpServer, serverCtx, serverProtocols).metrics(true, Function.identity()).bindNow();
    AtomicReference<SocketAddress> clientAddress = new AtomicReference<>();
    httpClient = httpClient.doAfterRequest((req, conn) -> clientAddress.set(conn.channel().localAddress()));
    String uri = "/4";
    String address = formatSocketAddress(disposableServer.address());
    CountDownLatch latch = new CountDownLatch(1);
    httpClient = customizeClientOptions(httpClient, clientCtx, clientProtocols);
    httpClient.doOnResponse((res, conn) -> conn.channel().closeFuture().addListener(f -> latch.countDown())).metrics(true, Function.identity()).post().uri(uri).send(body).responseContent().aggregate().asString().as(StepVerifier::create).expectNext("Hello World!").expectComplete().verify(Duration.ofSeconds(30));
    assertThat(latch.await(30, TimeUnit.SECONDS)).as("latch await").isTrue();
    // ensure that the server counters have been updated. For the moment, wait 1 sec.
    Thread.sleep(1000);
    // now check the server counters
    checkGauge(SERVER_CONNECTIONS_TOTAL, true, 0, URI, HTTP, LOCAL_ADDRESS, address);
    checkGauge(SERVER_CONNECTIONS_ACTIVE, true, 0, URI, HTTP, LOCAL_ADDRESS, address);
    // These metrics are meant only for the servers,
    // connections metrics for the clients are available from the connection pool
    address = formatSocketAddress(clientAddress.get());
    checkGauge(CLIENT_CONNECTIONS_TOTAL, false, 0, URI, HTTP, LOCAL_ADDRESS, address);
    checkGauge(CLIENT_CONNECTIONS_ACTIVE, false, 0, URI, HTTP, LOCAL_ADDRESS, address);
    disposableServer.disposeNow();
}
Also used : BeforeEach(org.junit.jupiter.api.BeforeEach) StepVerifier(reactor.test.StepVerifier) SocketAddress(java.net.SocketAddress) ContextView(reactor.util.context.ContextView) ContextAwareHttpServerMetricsRecorder(reactor.netty.http.server.ContextAwareHttpServerMetricsRecorder) Assertions.assertThat(org.assertj.core.api.Assertions.assertThat) BaseHttpTest(reactor.netty.BaseHttpTest) DATA_SENT_TIME(reactor.netty.Metrics.DATA_SENT_TIME) Counter(io.micrometer.api.instrument.Counter) Tags(io.micrometer.api.instrument.Tags) ProtocolSslContextSpec(reactor.netty.tcp.SslProvider.ProtocolSslContextSpec) BeforeAll(org.junit.jupiter.api.BeforeAll) ByteBufFlux(reactor.netty.ByteBufFlux) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Duration(java.time.Duration) MethodSource(org.junit.jupiter.params.provider.MethodSource) Timer(io.micrometer.api.instrument.Timer) ERRORS(reactor.netty.Metrics.ERRORS) RESPONSE_TIME(reactor.netty.Metrics.RESPONSE_TIME) Context(reactor.util.context.Context) TLS_HANDSHAKE_TIME(reactor.netty.Metrics.TLS_HANDSHAKE_TIME) MeterRegistryAssert(io.micrometer.core.tck.MeterRegistryAssert) Arguments(org.junit.jupiter.params.provider.Arguments) InetSocketAddress(java.net.InetSocketAddress) DistributionSummary(io.micrometer.api.instrument.DistributionSummary) HTTP_CLIENT_PREFIX(reactor.netty.Metrics.HTTP_CLIENT_PREFIX) Test(org.junit.jupiter.api.Test) STATUS(reactor.netty.Metrics.STATUS) ContextAwareHttpClientMetricsRecorder(reactor.netty.http.client.ContextAwareHttpClientMetricsRecorder) CountDownLatch(java.util.concurrent.CountDownLatch) HttpServer(reactor.netty.http.server.HttpServer) Stream(java.util.stream.Stream) Named(org.junit.jupiter.api.Named) CONNECT_TIME(reactor.netty.Metrics.CONNECT_TIME) Gauge(io.micrometer.api.instrument.Gauge) HttpClient(reactor.netty.http.client.HttpClient) SimpleMeterRegistry(io.micrometer.api.instrument.simple.SimpleMeterRegistry) REMOTE_ADDRESS(reactor.netty.Metrics.REMOTE_ADDRESS) HTTP_SERVER_PREFIX(reactor.netty.Metrics.HTTP_SERVER_PREFIX) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) Nullable(reactor.util.annotation.Nullable) AtomicReference(java.util.concurrent.atomic.AtomicReference) Function(java.util.function.Function) InsecureTrustManagerFactory(io.netty.handler.ssl.util.InsecureTrustManagerFactory) ByteBuf(io.netty.buffer.ByteBuf) DATA_SENT(reactor.netty.Metrics.DATA_SENT) METHOD(reactor.netty.Metrics.METHOD) DATA_RECEIVED_TIME(reactor.netty.Metrics.DATA_RECEIVED_TIME) Metrics.formatSocketAddress(reactor.netty.Metrics.formatSocketAddress) CONNECTIONS_ACTIVE(reactor.netty.Metrics.CONNECTIONS_ACTIVE) CONNECTIONS_TOTAL(reactor.netty.Metrics.CONNECTIONS_TOTAL) SelfSignedCertificate(io.netty.handler.ssl.util.SelfSignedCertificate) HttpServerMetricsRecorder(reactor.netty.http.server.HttpServerMetricsRecorder) Mono(reactor.core.publisher.Mono) CertificateException(java.security.cert.CertificateException) LOCAL_ADDRESS(reactor.netty.Metrics.LOCAL_ADDRESS) TimeUnit(java.util.concurrent.TimeUnit) Flux(reactor.core.publisher.Flux) AfterEach(org.junit.jupiter.api.AfterEach) ParameterizedTest(org.junit.jupiter.params.ParameterizedTest) SslProvider(io.netty.handler.ssl.SslProvider) MeterRegistry(io.micrometer.api.instrument.MeterRegistry) Metrics(io.micrometer.api.instrument.Metrics) DATA_RECEIVED(reactor.netty.Metrics.DATA_RECEIVED) ConnectionProvider(reactor.netty.resources.ConnectionProvider) URI(reactor.netty.Metrics.URI) AtomicReference(java.util.concurrent.atomic.AtomicReference) SocketAddress(java.net.SocketAddress) InetSocketAddress(java.net.InetSocketAddress) Metrics.formatSocketAddress(reactor.netty.Metrics.formatSocketAddress) CountDownLatch(java.util.concurrent.CountDownLatch) ParameterizedTest(org.junit.jupiter.params.ParameterizedTest) MethodSource(org.junit.jupiter.params.provider.MethodSource)

Example 9 with ProtocolSslContextSpec

use of reactor.netty.tcp.SslProvider.ProtocolSslContextSpec in project reactor-netty by reactor.

the class Http2Tests method doTestIssue1394_SchemeHttp.

private void doTestIssue1394_SchemeHttp(String expectedStreamId, HttpProtocol... protocols) {
    disposableServer = createServer().host("localhost").protocol(HttpProtocol.HTTP11, HttpProtocol.H2C).handle((req, res) -> res.sendString(Mono.just("testIssue1394"))).bindNow(Duration.ofSeconds(30));
    ProtocolSslContextSpec clientCtx;
    if (protocols.length == 1 && protocols[0] == HttpProtocol.HTTP11) {
        clientCtx = Http11SslContextSpec.forClient();
    } else {
        clientCtx = Http2SslContextSpec.forClient();
    }
    HttpClient.create().protocol(protocols).secure(spec -> spec.sslContext(clientCtx)).wiretap(true).get().uri("http://localhost:" + disposableServer.port() + "/").responseSingle((res, bytes) -> Mono.just(res.responseHeaders().get("x-http2-stream-id", "null"))).as(StepVerifier::create).expectNext(expectedStreamId).expectComplete().verify(Duration.ofSeconds(30));
}
Also used : ProtocolSslContextSpec(reactor.netty.tcp.SslProvider.ProtocolSslContextSpec)

Aggregations

Counter (io.micrometer.api.instrument.Counter)8 DistributionSummary (io.micrometer.api.instrument.DistributionSummary)8 Gauge (io.micrometer.api.instrument.Gauge)8 MeterRegistry (io.micrometer.api.instrument.MeterRegistry)8 Metrics (io.micrometer.api.instrument.Metrics)8 Tags (io.micrometer.api.instrument.Tags)8 Timer (io.micrometer.api.instrument.Timer)8 SimpleMeterRegistry (io.micrometer.api.instrument.simple.SimpleMeterRegistry)8 MeterRegistryAssert (io.micrometer.core.tck.MeterRegistryAssert)8 ByteBuf (io.netty.buffer.ByteBuf)8 SslProvider (io.netty.handler.ssl.SslProvider)8 InsecureTrustManagerFactory (io.netty.handler.ssl.util.InsecureTrustManagerFactory)8 SelfSignedCertificate (io.netty.handler.ssl.util.SelfSignedCertificate)8 InetSocketAddress (java.net.InetSocketAddress)8 SocketAddress (java.net.SocketAddress)8 CertificateException (java.security.cert.CertificateException)8 Duration (java.time.Duration)8 CountDownLatch (java.util.concurrent.CountDownLatch)8 TimeUnit (java.util.concurrent.TimeUnit)8 AtomicBoolean (java.util.concurrent.atomic.AtomicBoolean)8