consumer同步实现分析
send执行链中HeaderExchangeChannel-request() 创建了 DefaultFuture,依赖 DefaultFuture实现同步功能。
DefaultFuture 通过await,signal();实现请求和响应同步
HeaderExchangeChannel
public ResponseFuture request(Object request, int timeout) throws RemotingException {
//......
//返回future ,future 肯定是 channel.send(req);执行后生成某些东西。
// future是怎么与channel.send(req);建立关系的?
DefaultFuture future = new DefaultFuture(channel, req, timeout);
try {
channel.send(req);//A
} catch (RemotingException e) {
future.cancel();
throw e;
}
return future;
}
new DefaultFuture(channel, req, timeout);
public DefaultFuture(Channel channel, Request request, int timeout) {
this.channel = channel;
this.request = request;
this.id = request.getId();
this.timeout = timeout > 0 ? timeout : channel.getUrl().getPositiveParameter(Constants.TIMEOUT_KEY, Constants.DEFAULT_TIMEOUT);
// put into waiting map.
FUTURES.put(id, this);//注意这里。关联 send()的关键
CHANNELS.put(id, channel);
}
futrue.get()调用链
public Object get() throws RemotingException {
return get(timeout);
}
// 阻塞直到 response获取到对象
public Object get(int timeout) throws RemotingException {
if (timeout <= 0) {
timeout = Constants.DEFAULT_TIMEOUT;
}
if (!isDone()) {
long start = System.currentTimeMillis();
lock.lock();
try {
while (!isDone()) {
done.await(timeout, TimeUnit.MILLISECONDS);
if (isDone() || System.currentTimeMillis() - start > timeout) {
break;
}
}
} catch (InterruptedException e) {
throw new RuntimeException(e);
} finally {
lock.unlock();
}
if (!isDone()) {
throw new TimeoutException(sent > 0, channel, getTimeoutMessage(false));
}
}
return returnFromResponse();
}
response是从哪里获取的呢?
DefaultFuture 中有个receiv