@Override public void exceptionCaught(final ChannelHandlerContext ctx, final Throwable cause) throws Exception { LOG.debug("Error originating from {}. Cause {}.", futureResponse.request(), cause); if (futureResponse.isCompleted()) { LOG.warn( "Got exception, but ignored it. (FutureResponse completed.): {}.", futureResponse.failedReason()); } else { if (LOG.isDebugEnabled()) { LOG.debug("Exception caught, but handled properly: " + cause.toString()); } if (cause instanceof PeerException) { PeerException pe = (PeerException) cause; if (pe.abortCause() != PeerException.AbortCause.USER_ABORT) { // do not force if we ran into a timeout, the peer may be // busy synchronized (peerBean.peerStatusListeners()) { for (PeerStatusListener peerStatusListener : peerBean.peerStatusListeners()) { peerStatusListener.peerFailed(futureResponse.request().recipient(), pe); } } LOG.debug("Removed from map. Cause: {}. Message: {}.", pe.toString(), message); } else { LOG.warn("Error in request.", cause); } } else { synchronized (peerBean.peerStatusListeners()) { for (PeerStatusListener peerStatusListener : peerBean.peerStatusListeners()) { peerStatusListener.peerFailed( futureResponse.request().recipient(), new PeerException(cause)); } } } } futureResponse.failedLater(cause); ctx.close(); }