public FutureDirect start() { if (peer.isShutdown()) { return FUTURE_REQUEST_SHUTDOWN; } final boolean keepAlive; final PeerAddress remotePeer; if (recipientAddress != null && recipientConnection == null) { keepAlive = false; remotePeer = recipientAddress; } else if (recipientAddress == null && recipientConnection != null) { keepAlive = true; remotePeer = recipientConnection.remotePeer(); } else if (peerConnection != null) { keepAlive = true; remotePeer = peerConnection.remotePeer(); } else { throw new IllegalArgumentException("either remotePeer or connection has to be set"); } if (futureChannelCreator == null) { futureChannelCreator = peer.connectionBean().reservation().create(isForceUDP() ? 1 : 0, isForceUDP() ? 0 : 1); } final RequestHandler<FutureResponse> request = peer.directDataRPC().sendInternal(remotePeer, this); if (keepAlive) { if (peerConnection != null) { sendDirectRequest(request, peerConnection); } else { recipientConnection.addListener( new BaseFutureAdapter<FuturePeerConnection>() { @Override public void operationComplete(final FuturePeerConnection future) throws Exception { if (future.isSuccess()) { sendDirectRequest(request, future.peerConnection()); } else { request.futureResponse().failed("Could not acquire channel (1)", future); } } }); } } else { futureChannelCreator.addListener( new BaseFutureAdapter<FutureChannelCreator>() { @Override public void operationComplete(final FutureChannelCreator future) throws Exception { if (future.isSuccess()) { final FutureResponse futureResponse = request.sendTCP(future.channelCreator()); Utils.addReleaseListener(future.channelCreator(), futureResponse); } else { request.futureResponse().failed("could not create channel", future); } } }); } return new FutureDirect(request.futureResponse()); }