List of usage examples for io.netty.channel.pool ChannelPool release
Future<Void> release(Channel channel);
From source file:org.eclipse.californium.elements.tcp.TcpClientConnector.java
License:Open Source License
@Override public void send(final RawData msg) { if (msg == null) { throw new NullPointerException("Message must not be null"); }//from w w w. j a v a2s . co m if (msg.isMulticast()) { LOGGER.warn("TcpConnector drops {} bytes to multicast {}:{}", msg.getSize(), msg.getAddress(), msg.getPort()); msg.onError(new MulticastNotSupportedException("TCP doesn't support multicast!")); return; } if (workerGroup == null) { msg.onError(new IllegalStateException("TCP client connector not running!")); return; } InetSocketAddress addressKey = msg.getInetSocketAddress(); final boolean connected = poolMap.contains(addressKey); final EndpointContextMatcher endpointMatcher = getEndpointContextMatcher(); /* check, if a new connection should be established */ if (endpointMatcher != null && !connected && !endpointMatcher.isToBeSent(msg.getEndpointContext(), null)) { LOGGER.warn("TcpConnector drops {} bytes to new {}:{}", msg.getSize(), msg.getAddress(), msg.getPort()); msg.onError(new EndpointMismatchException("no connection")); return; } if (!connected) { msg.onConnecting(); } final ChannelPool channelPool = poolMap.get(addressKey); Future<Channel> acquire = channelPool.acquire(); acquire.addListener(new GenericFutureListener<Future<Channel>>() { @Override public void operationComplete(Future<Channel> future) throws Exception { Throwable cause = null; if (future.isSuccess()) { Channel channel = future.getNow(); try { send(channel, endpointMatcher, msg); } catch (Throwable t) { cause = t; } finally { try { channelPool.release(channel); } catch (RejectedExecutionException e) { LOGGER.debug("{}", e.getMessage()); } } } else if (future.isCancelled()) { cause = new CancellationException(); } else { cause = future.cause(); } if (cause != null) { if (cause instanceof ConnectTimeoutException) { LOGGER.warn("{}", cause.getMessage()); } else if (cause instanceof CancellationException) { LOGGER.debug("{}", cause.getMessage()); } else { LOGGER.warn("Unable to open connection to {}", msg.getAddress(), future.cause()); } msg.onError(future.cause()); } } }); }