@Override public void afterPropertiesSet() { if (this.useGlobalResources) { Assert.isTrue(this.loopResources == null && this.connectionProvider == null, "'useGlobalResources' is mutually exclusive with explicitly configured resources"); HttpResources httpResources = HttpResources.get(); if (this.globalResourcesConsumer != null) { this.globalResourcesConsumer.accept(httpResources); } this.connectionProvider = httpResources; this.loopResources = httpResources; } else { if (this.loopResources == null) { this.manageLoopResources = true; this.loopResources = this.loopResourcesSupplier.get(); } if (this.connectionProvider == null) { this.manageConnectionProvider = true; this.connectionProvider = this.connectionProviderSupplier.get(); } } }
@Override public void destroy() { if (this.useGlobalResources) { HttpResources.disposeLoopsAndConnections(); } else { try { ConnectionProvider provider = this.connectionProvider; if (provider != null && this.manageConnectionProvider) { provider.dispose(); } } catch (Throwable ex) { // ignore } try { LoopResources resources = this.loopResources; if (resources != null && this.manageLoopResources) { resources.dispose(); } } catch (Throwable ex) { // ignore } } }
@Test public void globalResources() throws Exception { this.resourceFactory.setUseGlobalResources(true); this.resourceFactory.afterPropertiesSet(); HttpResources globalResources = HttpResources.get(); assertSame(globalResources, this.resourceFactory.getConnectionProvider()); assertSame(globalResources, this.resourceFactory.getLoopResources()); assertFalse(globalResources.isDisposed()); this.resourceFactory.destroy(); assertTrue(globalResources.isDisposed()); }
@Override public void dispose() { server.dispose(); HttpResources.get() .disposeWhen(server.address()); }
/** * Reset http resources to default and return its instance * * @return the global HTTP resources */ public static HttpResources reset() { disposeLoopsAndConnections(); return getOrCreate(httpResources, null, null, ON_HTTP_NEW, "http"); }
/** * Update event loops resources and return the global HTTP resources * * @return the global HTTP resources */ public static HttpResources set(ConnectionProvider provider) { return getOrCreate(httpResources, null, provider, ON_HTTP_NEW, "http"); }
@Test public void shutdownLaterDefers() { HttpResources oldHttpResources = HttpResources.httpResources.getAndSet(testResources); HttpResources newHttpResources = HttpResources.httpResources.get(); try { assertThat(newHttpResources).isSameAs(testResources); HttpResources.disposeLoopsAndConnectionsLater(); assertThat(newHttpResources.isDisposed()).isFalse(); HttpResources.disposeLoopsAndConnectionsLater().block(); assertThat(newHttpResources.isDisposed()).as("disposeLoopsAndConnectionsLater completion").isTrue(); assertThat(HttpResources.httpResources.get()).isNull(); } finally { if (oldHttpResources != null && !HttpResources.httpResources.compareAndSet(null, oldHttpResources)) { oldHttpResources.dispose(); } } }
@Test @Ignore public void disposeLaterDefers() { assertThat(testResources.isDisposed()).isFalse(); testResources.disposeLater(); assertThat(testResources.isDisposed()).isFalse(); testResources.disposeLater() .doOnSuccess(c -> assertThat(testResources.isDisposed()).isTrue()) .subscribe(); //not immediately disposed when subscribing assertThat(testResources.isDisposed()).as("immediate status on disposeLater subscribe").isFalse(); }
/** * Shutdown the global {@link HttpResources} without resetting them, * effectively cleaning up associated resources without creating new ones. */ public static void disposeLoopsAndConnections() { HttpResources resources = httpResources.getAndSet(null); if (resources != null) { resources._dispose(); } }
/** * Prepare to shutdown the global {@link HttpResources} 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(() -> { HttpResources resources = httpResources.getAndSet(null); if (resources != null) { return resources._disposeLater(); } return Mono.empty(); }); }
@Override public void dispose() { server.dispose(); HttpResources.get() .disposeWhen(server.address()); }
/** * Reset http resources to default and return its instance * * @return the global HTTP resources */ public static HttpResources reset() { disposeLoopsAndConnections(); return getOrCreate(httpResources, null, null, ON_HTTP_NEW, "http"); }
/** * Update pooling resources and return the global HTTP resources * * @return the global HTTP resources */ public static HttpResources set(LoopResources loops) { return getOrCreate(httpResources, loops, null, ON_HTTP_NEW, "http"); }
/** * Shutdown the global {@link HttpResources} without resetting them, * effectively cleaning up associated resources without creating new ones. */ public static void disposeLoopsAndConnections() { HttpResources resources = httpResources.getAndSet(null); if (resources != null) { resources._dispose(); } }
/** * Prepare to shutdown the global {@link HttpResources} 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(() -> { HttpResources resources = httpResources.getAndSet(null); if (resources != null) { return resources._disposeLater(); } return Mono.empty(); }); }
@Override public void afterPropertiesSet() { if (this.useGlobalResources) { Assert.isTrue(this.loopResources == null && this.connectionProvider == null, "'useGlobalResources' is mutually exclusive with explicitly configured resources"); HttpResources httpResources = HttpResources.get(); if (this.globalResourcesConsumer != null) { this.globalResourcesConsumer.accept(httpResources); } this.connectionProvider = httpResources; this.loopResources = httpResources; } else { if (this.loopResources == null) { this.manageLoopResources = true; this.loopResources = this.loopResourcesSupplier.get(); } if (this.connectionProvider == null) { this.manageConnectionProvider = true; this.connectionProvider = this.connectionProviderSupplier.get(); } } }
@Override public final void dispose() { // Returned value is deliberately ignored f.removeListener(this); if (f.channel() .isActive()) { f.channel() .close(); HttpResources.get() .disposeWhen(bootstrap.config() .localAddress()); } else if (!f.isDone()) { f.cancel(true); } }
@Override public void destroy() { if (this.useGlobalResources) { HttpResources.disposeLoopsAndConnections(); } else { try { ConnectionProvider provider = this.connectionProvider; if (provider != null && this.manageConnectionProvider) { provider.dispose(); } } catch (Throwable ex) { // ignore } try { LoopResources resources = this.loopResources; if (resources != null && this.manageLoopResources) { resources.dispose(); } } catch (Throwable ex) { // ignore } } }
/** * Return the global HTTP resources for event loops and pooling * * @return the global HTTP resources for event loops and pooling */ public static HttpResources get() { return getOrCreate(httpResources, null, null, ON_HTTP_NEW, "http"); }
@Test public void localResources() throws Exception { this.resourceFactory.setUseGlobalResources(false); this.resourceFactory.afterPropertiesSet(); ConnectionProvider connectionProvider = this.resourceFactory.getConnectionProvider(); LoopResources loopResources = this.resourceFactory.getLoopResources(); assertNotSame(HttpResources.get(), connectionProvider); assertNotSame(HttpResources.get(), loopResources); // The below does not work since ConnectionPoolProvider simply checks if pool is empty. // assertFalse(connectionProvider.isDisposed()); assertFalse(loopResources.isDisposed()); this.resourceFactory.destroy(); assertTrue(connectionProvider.isDisposed()); assertTrue(loopResources.isDisposed()); }