这个异步调用方法中传入一个final 回调对象。

  1. public void invokeAsyncImpl(final Channel channel, final RemotingCommand request, final long timeoutMillis,
  2. final InvokeCallback invokeCallback)
  3. throws InterruptedException, RemotingTooMuchRequestException, RemotingTimeoutException, RemotingSendRequestException {
  4. System.out.println("NettyRemotingAbstract.invokeAsyncImpl()****************");
  5. final int opaque = request.getOpaque();
  6. //超时信号量锁
  7. boolean acquired = this.semaphoreAsync.tryAcquire(timeoutMillis, TimeUnit.MILLISECONDS);
  8. if (acquired) {
  9. final SemaphoreReleaseOnlyOnce once = new SemaphoreReleaseOnlyOnce(this.semaphoreAsync);
  10.  
  11. //这个ResonseFuture的封装的思路。
  12. final ResponseFuture responseFuture = new ResponseFuture(opaque, timeoutMillis, invokeCallback, once);
  13. this.responseTable.put(opaque, responseFuture);
  14. try {
  15. //----》执行io请求,添加channelfuture监听器
  16. channel.writeAndFlush(request).addListener(new ChannelFutureListener() {
  17. @Override
  18. public void operationComplete(ChannelFuture f) throws Exception {
  19. //这里只是发送成功!!!!!!!!!!!!!!!!!!!!!!!!!
  20. if (f.isSuccess()) {
  21. responseFuture.setSendRequestOK(true);
  22. return;
  23. } else {
  24. responseFuture.setSendRequestOK(false);
  25. }
  26. //这里只是发送成功,返回设为nul。putResponse -> NULL
  27. responseFuture.putResponse(null);
  28. responseTable.remove(opaque);
  29. try {
  30. //发送成功后还没有返回消息时的,调用回调方法。参见:MQClientAPIImpl.sendMessageAsync(..)
  31. System.out.println("**************NettyRemotingAbstract.invokeAsyncImpl().callback()");
  32. responseFuture.executeInvokeCallback();
  33. } catch (Throwable e) {
  34. plog.warn("excute callback in writeAndFlush addListener, and callback throw", e);
  35. } finally {
  36. responseFuture.release();
  37. }
  38.  
  39. plog.warn("send a request command to channel <{}> failed.", RemotingHelper.parseChannelRemoteAddr(channel));
  40. }
  41. });
  42. } catch (Exception e) {
  43. responseFuture.release();
  44. plog.warn("send a request command to channel <" + RemotingHelper.parseChannelRemoteAddr(channel) + "> Exception", e);
  45. throw new RemotingSendRequestException(RemotingHelper.parseChannelRemoteAddr(channel), e);
  46. }
  47. } else {
  48. String info =
  49. String.format("invokeAsyncImpl tryAcquire semaphore timeout, %dms, waiting thread nums: %d semaphoreAsyncValue: %d", //
  50. timeoutMillis, //
  51. this.semaphoreAsync.getQueueLength(), //
  52. this.semaphoreAsync.availablePermits()//
  53. );
  54. plog.warn(info);
  55. throw new RemotingTooMuchRequestException(info);
  56. }
  57. }

我们往上面看看这个回调对象的回调方法:

RocketMQ的异步调用的更多相关文章

  1. SpringBoot异步调用--@Async详解

    1. 概述   在日常开发中,为了提高主线程的效率,往往需要采用异步调用处理,例如系统日志等.在实际业务场景中,可以使用消息中间件如RabbitMQ.RocketMQ.Kafka等来解决.假如对高可用 ...

  2. C#委托异步调用

    参考页面: http://www.yuanjiaocheng.net/webapi/mvc-consume-webapi-get.html http://www.yuanjiaocheng.net/w ...

  3. Direct3D Draw函数 异步调用原理解析

    概述 在D3D10中,一个基本的渲染流程可分为以下步骤: 清理帧缓存: 执行若干次的绘制: 通过Device API创建所需Buffer: 通过Map/Unmap填充数据到Buffer中: 将Buff ...

  4. 一个简单的webservice的demo(下)winform异步调用webservice

    绕了一大圈,又开始接触winform的项目来了,虽然很小吧.写一个winform的异步调用webservice的demo,还是简单的. 一个简单的Webservice的demo,简单模拟服务 一个简单 ...

  5. 浅析jquery ajax异步调用方法中不能给全局变量赋值的原因及解决方法(转载)

    在调用一个jquery的ajax方法时我们有时会需要该方法返回一个值或者给某个全局变量赋值,可是我们发现程序执行完后并没有获取到我们想要的值,这时很有可能是因为你用的是ajax的异步调用async:t ...

  6. tornado 异步调用系统命令和非阻塞线程池

    项目中异步调用 ping 和 nmap 实现对目标 ip 和所在网关的探测 Subprocess.STREAM 不用担心进程返回数据过大造成的死锁, Subprocess.PIPE 会有这个问题. i ...

  7. .Net组件程序设计之异步调用

    .Net组件程序设计之异步调用 说到异步调用,在脑海中首先想到就是BeginInvoke(),在一些常用对象中我们也会常常见到Invoke()和BeginInvoke(), 要想让自己的组件可以被客户 ...

  8. 谈谈RPC中的异步调用设计

    RPC(远过程调用)在分布式系统中是很常用的基础通讯手段,核心思想是将不同进程之间的通讯抽象为函数调用,基本的过程是调用端通过将参数序列化到流中并发送给服务端,服务端从流中反序列化出参数并完成实际的处 ...

  9. (转)spring boot注解 --@EnableAsync 异步调用

    原文:http://www.cnblogs.com/azhqiang/p/5609615.html EnableAsync注解的意思是可以异步执行,就是开启多线程的意思.可以标注在方法.类上. @Co ...

随机推荐

  1. python 多进程multiprocessing 模块

    multiprocessing 常用方法: cpu_count():统计cpu核数 multiprocessing.cpu_count() active_children() 获取所有子进程 mult ...

  2. WAB QQ第三方登录

    应用场景     web应用通过QQ登录授权实现第三方登录.   操作步骤     1  注册成为QQ互联平台开发者,http://connect.qq.com/     2  准备一个可访问的域名, ...

  3. 正则表达式、re、常用模块

    阅读目录 正则表达式 字符 量词 . ^ $ * + ? { } 字符集[][^] 分组 ()与 或 |[^] 转义符 \ 贪婪匹配 re 总结 正则 re 常用模块 namedtuple deque ...

  4. hdu 5175(数论)

    Misaki's Kiss again Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Othe ...

  5. 更改yum源为网易的

    更改yum源为网易的. mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup cd /etc/yu ...

  6. STL模板整理 pair

    pair pair是一种模板类型,其中包含两个数据值,两个数据的类型可以不同.如果一个函数有两个返回值的话,如果是相同类型,就可以用数组返回,如果是不同类型,就可以自己写个struct ,但为了方便就 ...

  7. Jmeter 监控远程服务器

    压力测试中如何监控服务器的性能呢? 性能选取哪些指标? 环境配置: Jmeter安装路径:E:\SOFEWARE\apache-jmeter-3.1: 需要将JMeterPlugins-Extras. ...

  8. [centos6.5] 完全卸载httpd mysql php

    rpm -qa|grep mysql # 列出所有mysql相关包 rpm -e 包名 # 逐一卸载,一个方便技巧是:卸载时可以不带版本,比如 # mysqlclient10-3.23.58-4.RH ...

  9. ZCMU新人训练赛-B

     Tom's Meadow Tom has a meadow in his garden. He divides it into N * M squares. Initially all the sq ...

  10. hdu6049

    hdu6049 题意 给出一串由 \([1, n]\) 组成的 \(n\) 个数,每个数字都不相同.现在要尽可能的分成多个块,每个块内的数可以任意排序,且分完块后可以交换两个块的位置,问使得最后序列有 ...