@Override public void run(Timeout timeout) throws Exception { if (tryDone()) { if (callback != null) { callback.onTimeout(); } } }
private void writeRequest(Channel channel, RequestContext context) { channel.attr(requestKey).set(context); pool.attachHost(context.host, channel); channel.writeAndFlush(context.request).addListener((ChannelFutureListener) future -> { if (!future.isSuccess()) { RequestContext info = future.channel().attr(requestKey).getAndSet(null); info.tryDone(); info.onFailure(503, "Service Unavailable"); LOGGER.debug("request failure request={}", info); pool.tryRelease(future.channel()); } }); }
@Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { RequestContext context = ctx.channel().attr(client.requestKey).getAndSet(null); try { if (context != null && context.tryDone()) { context.onException(cause); } } finally { client.pool.tryRelease(ctx.channel()); } LOGGER.error("http client caught an ex, info={}", context, cause); }
writeRequest(future.channel(), context); } else {//3.2如果链接创建失败,直接返回客户端网关超时 context.tryDone(); context.onFailure(504, "Gateway Timeout"); LOGGER.warn("create new channel failure, request={}", context);
@Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { RequestContext context = ctx.channel().attr(client.requestKey).getAndSet(null); try { if (context != null && context.tryDone()) { LOGGER.debug("receive server response, request={}, response={}", context, msg); HttpResponse response = (HttpResponse) msg; if (isRedirect(response)) { if (context.onRedirect(response)) { String location = getRedirectLocation(context.request, response); if (location != null && location.length() > 0) { context.cancelled.set(false); context.request.setUri(location); client.request(context); return; } } } context.onResponse(response); } else { LOGGER.warn("receive server response but timeout, request={}, response={}", context, msg); } } finally { client.pool.tryRelease(ctx.channel()); ReferenceCountUtil.release(msg); } }