消息异步发送的核心在于当request发送后,线程没有阻塞等待response的返回,那么response该如何处理呢?
首先明确的一点是response的处理是通过回调函数实现的。那回调函数是在哪里执行的?又是怎么处理的?
当request异步发送之前,首先会将request的opaque作为key,responseFuture作为value保存在responseTable中。
当收到response时,通过opaque从responseTable取出responseFuture。responseFuture中封装了回调函数invokeCallback(),可以进行回调逻辑的执行,在回调函数执行时,如果设置了回调的线程池,则通过线程池异步执行,否则通过当前线程执行。
回调执行结束后,整个消息的异步发送流程就结束了。
请求发送过程中的相关源码
this.remotingClient.invokeAsync(addr, request, timeoutMillis, new InvokeCallback() {
@Override
public void operationComplete(ResponseFuture responseFuture) {
RemotingCommand response = responseFuture.getResponseCommand();
//TODO: 响应的处理逻辑
}
});
NettyRemotingClient类中invokeAsync(String addr, RemotingCommand request, long timeoutMillis, InvokeCallback invokeCallback)方法的实现。
@Override
public void invokeAsync(String addr, RemotingCommand request, long timeoutMillis, InvokeCallback invokeCallback)
throws InterruptedException, RemotingConnectException, RemotingTooMuchRequestException, RemotingTimeoutException,
RemotingSendRequestException {
long beginStartTime = System.currentTimeMillis();
final Channel channel = this.getAndCreateChannel(addr);
if (channel != null && channel.isActive()) {
try {
doBeforeRpcHooks(addr, request);
long costTime = System.currentTimeMillis() - beginStartTime;
if (timeoutMillis < costTime) {