/** * Shutdown the global {@link TcpResources} without resetting them, * effectively cleaning up associated resources without creating new ones. */ public static void disposeLoopsAndConnections() { TcpResources resources = tcpResources.getAndSet(null); if (resources != null) { resources._dispose(); } }
/** * Reset http resources to default and return its instance * * @return the global HTTP resources */ public static TcpResources reset() { disposeLoopsAndConnections(); return getOrCreate(tcpResources, null, null, ON_TCP_NEW, "tcp"); }
/** * Prepare a pooled {@link TcpClient} * * @return a {@link TcpClient} */ public static TcpClient create() { return create(TcpResources.get()); }
/** * Return the global HTTP resources for event loops and pooling * * @return the global HTTP resources for event loops and pooling */ public static TcpResources get() { return getOrCreate(tcpResources, null, null, ON_TCP_NEW, "tcp"); }
@Test public void shutdownLaterDefers() { TcpResources oldTcpResources = TcpResources.tcpResources.getAndSet(tcpResources); TcpResources newTcpResources = TcpResources.tcpResources.get(); try { assertThat(newTcpResources).isSameAs(tcpResources); TcpResources.disposeLoopsAndConnectionsLater(); assertThat(newTcpResources.isDisposed()).isFalse(); TcpResources.disposeLoopsAndConnectionsLater().block(); assertThat(newTcpResources.isDisposed()).as("disposeLoopsAndConnectionsLater completion").isTrue(); assertThat(TcpResources.tcpResources.get()).isNull(); } finally { if (oldTcpResources != null && !TcpResources.tcpResources.compareAndSet(null, oldTcpResources)) { oldTcpResources.dispose(); } } }
/** * Prepare to shutdown the global {@link TcpResources} without resetting them, * effectively cleaning up associated resources without creating new ones. This only * occurs when the returned {@link Mono} is subscribed to. * * @return a {@link Mono} triggering the {@link #disposeLoopsAndConnections()} when subscribed to. */ public static Mono<Void> disposeLoopsAndConnectionsLater() { return Mono.defer(() -> { TcpResources resources = tcpResources.getAndSet(null); if (resources != null) { return resources._disposeLater(); } return Mono.empty(); }); }
@Test @Ignore public void disposeLaterDefers() { assertThat(tcpResources.isDisposed()).isFalse(); tcpResources.disposeLater(); assertThat(tcpResources.isDisposed()).isFalse(); tcpResources.disposeLater() .doOnSuccess(c -> assertThat(tcpResources.isDisposed()).isTrue()) .subscribe(); //not immediately disposed when subscribing assertThat(tcpResources.isDisposed()).as("immediate status on disposeLater subscribe").isFalse(); }
tcpResources = new TcpResources(loopResources, poolResources);
/** * Prepare a pooled {@link TcpClient} * * @return a {@link TcpClient} */ public static TcpClient create() { return create(TcpResources.get()); }
/** * Update provider resources and return the global HTTP resources * * @return the global HTTP resources */ public static TcpResources set(ConnectionProvider provider) { return getOrCreate(tcpResources, null, provider, ON_TCP_NEW, "tcp"); }
/** * Prepare to shutdown the global {@link TcpResources} without resetting them, * effectively cleaning up associated resources without creating new ones. This only * occurs when the returned {@link Mono} is subscribed to. * * @return a {@link Mono} triggering the {@link #disposeLoopsAndConnections()} when subscribed to. */ public static Mono<Void> disposeLoopsAndConnectionsLater() { return Mono.defer(() -> { TcpResources resources = tcpResources.getAndSet(null); if (resources != null) { return resources._disposeLater(); } return Mono.empty(); }); }
/** * Reset http resources to default and return its instance * * @return the global HTTP resources */ public static TcpResources reset() { disposeLoopsAndConnections(); return getOrCreate(tcpResources, null, null, ON_TCP_NEW, "tcp"); }
@Override public Mono<? extends Connection> connect(Bootstrap b) { if (b.config() .group() == null) { TcpClientRunOn.configure(b, LoopResources.DEFAULT_NATIVE, TcpResources.get()); } return provider.acquire(b); } }
/** * Update pooling resources and return the global HTTP resources * * @return the global HTTP resources */ public static TcpResources set(LoopResources loops) { return getOrCreate(tcpResources, loops, null, ON_TCP_NEW ,"tcp"); }
/** * Shutdown the global {@link TcpResources} without resetting them, * effectively cleaning up associated resources without creating new ones. */ public static void disposeLoopsAndConnections() { TcpResources resources = tcpResources.getAndSet(null); if (resources != null) { resources._dispose(); } }
@Override public Mono<? extends Connection> connect(Bootstrap b) { if (b.config() .group() == null) { TcpClientRunOn.configure(b, LoopResources.DEFAULT_NATIVE, TcpResources.get()); } return provider.acquire(b); } }
/** * Update provider resources and return the global HTTP resources * * @return the global HTTP resources */ public static TcpResources set(ConnectionProvider provider) { return getOrCreate(tcpResources, null, provider, ON_TCP_NEW, "tcp"); }
@Override public Mono<? extends DisposableServer> bind(ServerBootstrap b) { SslProvider ssl = SslProvider.findSslSupport(b); if (ssl != null && ssl.getDefaultConfigurationType() == null) { ssl = SslProvider.updateDefaultConfiguration(ssl, SslProvider.DefaultConfigurationType.TCP); SslProvider.setBootstrap(b, ssl); } if (b.config() .group() == null) { TcpServerRunOn.configure(b, LoopResources.DEFAULT_NATIVE, TcpResources.get()); } return Mono.create(sink -> { ServerBootstrap bootstrap = b.clone(); ConnectionObserver obs = BootstrapHandlers.connectionObserver(bootstrap); ConnectionObserver childObs = BootstrapHandlers.childConnectionObserver(bootstrap); ChannelOperations.OnSetup ops = BootstrapHandlers.channelOperationFactory(bootstrap); convertLazyLocalAddress(bootstrap); BootstrapHandlers.finalizeHandler(bootstrap, ops, new ChildObserver(childObs)); ChannelFuture f = bootstrap.bind(); DisposableBind disposableServer = new DisposableBind(sink, f, obs, bootstrap); f.addListener(disposableServer); sink.onCancel(disposableServer); }); }