/** * Create a {@link ConnectionProvider} to cache and grow on demand {@link Connection}. * <p>An elastic {@link ConnectionProvider} will never wait before opening a new * connection. The reuse window is limited but it cannot starve an undetermined volume * of clients using it. * * @param name the channel pool map name * * @return a new {@link ConnectionProvider} to cache and grow on demand * {@link Connection} */ static ConnectionProvider elastic(String name) { return new PooledConnectionProvider(name, SimpleChannelPool::new); }
@Override public void dispose() { disposeLater().subscribe(); }
@Override public void disposeWhen(@NonNull SocketAddress address) { List<Map.Entry<PoolKey, Pool>> toDispose; toDispose = channelPools.entrySet() .stream() .filter(p -> compareAddresses(p.getKey().holder, address)) .collect(Collectors.toList()); toDispose.forEach(e -> { if (channelPools.remove(e.getKey(), e.getValue())) { if(log.isDebugEnabled()){ log.debug("Disposing pool for {}", e.getKey().fqdn); } e.getValue().pool.close(); } }); }
@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); }
@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); }
log.debug(format(c, "Immediately aborted pooled channel, re-acquiring new channel")); disposableAcquire(sink, obs, pool); return;
log.debug(format(c, "Immediately aborted pooled channel, re-acquiring new channel")); disposableAcquire(sink, obs, pool); return;
/** * Create a {@link ConnectionProvider} to cache and grow on demand {@link Connection}. * <p>An elastic {@link ConnectionProvider} will never wait before opening a new * connection. The reuse window is limited but it cannot starve an undetermined volume * of clients using it. * * @param name the channel pool map name * * @return a new {@link ConnectionProvider} to cache and grow on demand * {@link Connection} */ static ConnectionProvider elastic(String name) { return new PooledConnectionProvider(name, SimpleChannelPool::new); }
@Override public void dispose() { disposeLater().subscribe(); }
disposableAcquire(sink, obs, pool);
@Override public void disposeWhen(@NonNull SocketAddress address) { List<Map.Entry<PoolKey, Pool>> toDispose; toDispose = channelPools.entrySet() .stream() .filter(p -> compareAddresses(p.getKey().holder, address)) .collect(Collectors.toList()); toDispose.forEach(e -> { if (channelPools.remove(e.getKey(), e.getValue())) { if(log.isDebugEnabled()){ log.debug("Disposing pool for {}", e.getKey().fqdn); } e.getValue().pool.close(); } }); }
throw new IllegalArgumentException("Acquire Timeout value must " + "be " + "positive"); return new PooledConnectionProvider(name, (bootstrap, handler, checker) -> new FixedChannelPool(bootstrap, handler,
disposableAcquire(sink, obs, pool);
throw new IllegalArgumentException("Acquire Timeout value must " + "be " + "positive"); return new PooledConnectionProvider(name, (bootstrap, handler, checker) -> new FixedChannelPool(bootstrap, handler,