}
public Msg sendRequest(URI to, Msg data) throws TransportException {
AsyncMsg d = (AsyncMsg) data;
PooledAsynchChannel c = getNextAvailable();
FutureResult requestId = responseManager.getNextFutureResult();
try {
d.type = AsyncMsg.REQUEST_TYPE;
d.to = to.toString();
d.requestId = requestId.getID();
if (log.isTraceEnabled())
log.trace("sending request data for request: " + requestId.getID());
c.send(d);
} finally {
safeClose(c);
}
try {
Msg result = (AsyncMsg) requestId.poll(Registry.REQUEST_TIMEOUT);
if (log.isTraceEnabled())
log.trace("response data was corelated for request: " + requestId.getID());
if (result == null)
throw new TransportException("Request time out.");
return result;
} catch (InterruptedException e) {
throw new TransportException(e.getMessage());