@Test public void disposeOnlyOnce() { PooledConnectionProvider.Pool pool = new PooledConnectionProvider.Pool( new Bootstrap().group(new DefaultEventLoopGroup()), (b, handler, checker) -> channelPool, ChannelOperations.OnSetup.empty() ); PooledConnectionProvider poolResources = new PooledConnectionProvider("test", (b, handler, checker) -> channelPool); //"register" our fake Pool poolResources.channelPools.put( new PooledConnectionProvider.PoolKey( InetSocketAddress.createUnresolved("localhost", 80), -1), pool); poolResources.dispose(); assertThat(closed.get()).as("pool closed by dispose()").isEqualTo(1); Mono<Void> disposer = poolResources.disposeLater(); disposer.subscribe(); poolResources.disposeLater().subscribe(); poolResources.dispose(); assertThat(closed.get()).as("pool closed only once").isEqualTo(1); }
@Override public Mono<Void> disposeLater() { return Mono.fromRunnable(() -> { Pool pool; for (PoolKey key : channelPools.keySet()) { pool = channelPools.remove(key); if (pool != null) { pool.close(); } } }); }
void registerClose(Channel c) { if (log.isDebugEnabled()) { log.debug(format(c, "Registering pool release on close event for channel")); } c.closeFuture() .addListener(ff -> pool.release(c)); }
.getAndSet(ConnectionObserver.emptyListener()); pool.release(channel) .addListener(f -> { if (log.isDebugEnabled() && !f.isSuccess()) {
.getAndSet(ConnectionObserver.emptyListener()); pool.release(channel) .addListener(f -> { if (log.isDebugEnabled() && !f.isSuccess()) {
@Test public void disposeLaterDefers() { PooledConnectionProvider.Pool pool = new PooledConnectionProvider.Pool( new Bootstrap().group(new DefaultEventLoopGroup()), (b, handler, checker) -> channelPool, ChannelOperations.OnSetup.empty()); PooledConnectionProvider poolResources = new PooledConnectionProvider("test", (b, handler, checker) -> channelPool); //"register" our fake Pool poolResources.channelPools.put( new PooledConnectionProvider.PoolKey( InetSocketAddress.createUnresolved("localhost", 80), -1), pool); Mono<Void> disposer = poolResources.disposeLater(); assertThat(closed.get()).as("pool closed by disposeLater()").isEqualTo(0); disposer.subscribe(); assertThat(closed.get()).as("pool closed by disposer subscribe()").isEqualTo(1); }
@Override public void close() { if (compareAndSet(false, true)) { pool.close(); } }
@SuppressWarnings("FutureReturnValueIgnored") static void disposableAcquire(MonoSink<Connection> sink, ConnectionObserver obs, Pool pool) { Future<Channel> f = pool.acquire(); DisposableAcquire disposableAcquire = new DisposableAcquire(sink, f, pool, obs); // Returned value is deliberately ignored f.addListener(disposableAcquire); sink.onCancel(disposableAcquire); }
@Override public Future<Channel> acquire() { return acquire(defaultGroup.next() .newPromise()); }
@SuppressWarnings("FutureReturnValueIgnored") static void disposableAcquire(MonoSink<Connection> sink, ConnectionObserver obs, Pool pool) { Future<Channel> f = pool.acquire(); DisposableAcquire disposableAcquire = new DisposableAcquire(sink, f, pool, obs); // Returned value is deliberately ignored f.addListener(disposableAcquire); sink.onCancel(disposableAcquire); }
@Override public Future<Channel> acquire() { return acquire(defaultGroup.next() .newPromise()); }
@Override public void close() { if (compareAndSet(false, true)) { pool.close(); } }
@Override public Mono<Void> disposeLater() { return Mono.fromRunnable(() -> { Pool pool; for (PoolKey key : channelPools.keySet()) { pool = channelPools.remove(key); if (pool != null) { pool.close(); } } }); }
void registerClose(Channel c) { if (log.isDebugEnabled()) { log.debug(format(c, "Registering pool release on close event for channel")); } c.closeFuture() .addListener(ff -> pool.release(c)); }