rocketmq-remoting请求异步发送的处理流程

RocketMQ请求异步发送处理流程解析
本文深入探讨RocketMQ消息异步发送的核心机制,解析请求发送过程中的源码,强调回调函数在响应处理中的关键作用。当request异步发送时,使用opaque和responseFuture保存在responseTable中。响应到达时,通过opaque获取responseFuture,执行回调函数invokeCallback,若配置了线程池则异步执行,否则同步执行,完成消息发送流程。

消息异步发送的核心在于当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) {
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值