List<ClientRequestId> addedRequestIds = Lists.newArrayList();
List<RequestInfo> addedRequestInfos = Lists.newArrayList();
// Check all the requests for problems
for (Map.Entry<ClientRequestId, RequestInfo> entry :
clientRequestIdRequestInfoMap.entrySet()) {
RequestInfo requestInfo = entry.getValue();
ChannelFuture writeFuture = requestInfo.getWriteFuture();
// Request wasn't sent yet
if (writeFuture == null) {
continue;
}
// If not connected anymore, request failed, or the request is taking
// too long, re-establish and resend
if (!writeFuture.channel().isActive() ||
(writeFuture.isDone() && !writeFuture.isSuccess()) ||
(requestInfo.getElapsedMsecs() > maxRequestMilliseconds)) {
LOG.warn("checkRequestsForProblems: Problem with request id " +
entry.getKey() + " connected = " +
writeFuture.channel().isActive() +
", future done = " + writeFuture.isDone() + ", " +
"success = " + writeFuture.isSuccess() + ", " +
"cause = " + writeFuture.cause() + ", " +
"elapsed time = " + requestInfo.getElapsedMsecs() + ", " +
"destination = " + writeFuture.channel().remoteAddress() +
" " + requestInfo);
addedRequestIds.add(entry.getKey());
addedRequestInfos.add(new RequestInfo(
requestInfo.getDestinationAddress(), requestInfo.getRequest()));
}
}
// Add any new requests to the system, connect if necessary, and re-send
for (int i = 0; i < addedRequestIds.size(); ++i) {
ClientRequestId requestId = addedRequestIds.get(i);
RequestInfo requestInfo = addedRequestInfos.get(i);
if (clientRequestIdRequestInfoMap.put(requestId, requestInfo) ==
null) {
LOG.warn("checkRequestsForProblems: Request " + requestId +
" completed prior to sending the next request");
clientRequestIdRequestInfoMap.remove(requestId);
}
InetSocketAddress remoteServer = requestInfo.getDestinationAddress();
Channel channel = getNextChannel(remoteServer);
if (LOG.isInfoEnabled()) {
LOG.info("checkRequestsForProblems: Re-issuing request " + requestInfo);
}
ChannelFuture writeFuture = channel.write(requestInfo.getRequest());
requestInfo.setWriteFuture(writeFuture);
writeFuture.addListener(logErrorListener);
}
addedRequestIds.clear();
addedRequestInfos.clear();
}