负责缓存要发送的请求、将加了回调的请求交给NetworkClient、触发NetworkClient的IO。
主要方法是send和poll。调用send将请求缓存,调用poll让NetworkClient执行IO,其中trySend将加了回调逻辑的请求交给NetworkClient。
ConsumerNetworkClient的请求-响应处理是由自定义的RequestFutureCompletionHandler和RequestFuture协同实现的。RequestFutureCompletionHandler会包含并暴露一个RequestFuture,供外界调用。
public RequestFuture<ClientResponse> send(Node node, AbstractRequest.Builder<?> requestBuilder) {
long now = time.milliseconds();
RequestFutureCompletionHandler completionHandler = new RequestFutureCompletionHandler();
ClientRequest clientRequest = client.newClientRequest(node.idString(), requestBuilder, now, true,
completionHandler);
unsent.put(node, clientRequest);
// wakeup the client in case it is blocking in poll so that we can send the queued request
client.wakeup();
return completionHandler.future;
}
RequestFutureCompletionHandler继承了RequestCompletionHandler,因此作为回调传入client.newClientRequest,并实现了自己的回调逻辑,在被回调时触发RequestFuture的完成。
private class RequestFutureCompletionHandler implements RequestCompletionHandler {
在RequestFuture中可以添加监听器,当请求完成时进行回调。
两者的行为逻辑如下:
ConsumerNetworkClient利用unsent存储尚未发出的请求。
目前想到一个意义,加快客户端调用: