前言

rabbitmq提供了request/reply模式,通过这种模式可以比较轻松的实现rpc,我们可以拿到消费者的返回,通过replytimeout设置超时时间,如果超时返回null。

一、普通request/response模式

  1. client将消息传递个消息服务,放入队列,消息头中包含reply_to(用于接收消息的排他队列),correlation_id(唯一的,与请求相关);
  2. server通过队列拿到消息,将消息放到名字为reply_to队列(可以是临时的,可以是持久的)
  3. 客户端从reply_to队列中拿到消息,通过correlation_id判断是哪个请求。

如果reply队列采用临时队列,消息服务会有创建队列删除队列的操作,对性能消耗比较大,特别是集群环境下,创建队列必须经过所有节点的同意。
用持久的reply队列,如果客户端不是持久的管理起来比较麻烦。

二、RabbitMQ Direct reply-to

RabbitMQ3.4.0开始支持direct reply-to,从Spring AMQP 1.4.1开始,如果没指定reply接收队列(或者接收队列名不是amq.rabbitmq.reply-to),direct reply-to是默认的使用。

简单的说就是在普通request/response模式基础上,去掉了reply队列的使用,但也不是server直接回复client,消息也经过了channel、消息服务节点。

//超时时间
rabbitTemplate.setReplyTimeout(3000);
//唯一id
rabbitTemplate.setUserCorrelationId(true);
User user=new User();user.setAge(1);user.setName("heelo");
//            CorrelationData correlationData=new CorrelationData(UUID.randomUUID().toString());String id=UUID.randomUUID().toString();System.out.println("cd:"+id);MessageProperties messageProperties =   new MessageProperties();messageProperties.setContentType("application/json");messageProperties.setCorrelationId(id);Message message=new Message(mapper.writeValueAsBytes(user),messageProperties);
//                IntStream.range(0,100).forEach(arg ->{Message reply =rabbitTemplate.sendAndReceive("test.exchange","directKey2", message);System.out.println("reply:"+reply);

AsyncRabbitTemplate

@Beanpublic AsyncRabbitTemplate  asyncRabbitTemplate (RabbitTemplate rabbitTemplate){return new AsyncRabbitTemplate(rabbitTemplate);}
User user=new User();user.setAge(1);user.setName("heelo");String id= UUID.randomUUID().toString();System.out.println("cd:"+id);MessageProperties messageProperties =   new MessageProperties();messageProperties.setContentType("application/json");messageProperties.setCorrelationId(id);Message message=new Message(mapper.writeValueAsBytes(user),messageProperties);AsyncRabbitTemplate.RabbitMessageFuture reply =asyncRabbitTemplate.sendAndReceive("test.exchange","directKey", message);reply.addCallback(new SuccessCallback<Message>() {@Overridepublic void onSuccess(Message result) {System.out.println("receive body:"+new String(result.getBody()));}}, new FailureCallback() {@Overridepublic void onFailure(Throwable ex) {ex.printStackTrace();}});//reply.get()

spring-rabbitmq Direct reply-to 模式相关推荐

  1. rabbitmq direct 多个消费者_一文解析 RabbitMQ 最常用的三大模式

    Direct 模式 所有发送到 Direct Exchange 的消息被转发到 RouteKey 中指定的 Queue. Direct 模式可以使用 RabbitMQ 自带的 Exchange: de ...

  2. RabbitMQ学习记录 - Direct之Routing模式

    (内容均来自RabbitMQ官网:https://www.rabbitmq.com/tutorials/tutorial-four-java.html) 前面几篇学习了下RabbitMQ的" ...

  3. RabbitMQ的Routing 路由模式(Direct)

    RabbitMQ的Routing 路由模式 模式说明: 队列与交换机的绑定,不能是任意绑定了,而是要指定一个 RoutingKey(路由key) 消息的发送方在向 Exchange 发送消息时,也必须 ...

  4. RabbitMq | springboot (路由模式RoutingKey)整合Direct交换器

    生产者发送消息到交换机并指定一个路由key,消费者队列绑定到交换机时要制定路由key(key匹配就能接受消息,key不匹配就不能接受消息) 引入依赖: <dependency><gr ...

  5. rabbitmq direct reply-to 在springAMQP和python之间的使用

    背景 公司的一个项目使用rabbitmq作为broker进行交互,并且数据的查询方法使用RPC模式,RPC Client端使用java编写并使用springAMQP包与rabbitmq交互,在RPC ...

  6. rabbitmq direct 多个消费者_RabbitMQ实战应用技巧

    1. RabbitMQ实战应用技巧 1.1. 前言 由于项目原因,之后会和RabbitMQ比较多的打交道,所以让我们来好好整理下RabbitMQ的应用实战技巧,尽量避免日后的采坑 1.2. 概述 Ra ...

  7. Rabbitmq专题:springboot如何整合Rabbitmq?Rabbitmq有哪些工作模式?

    文章目录 1. Rabbitmq的安装 2. Rabbitmq的基本概念 3. RabbitMQ的工作模式 3.1 "Hello World!" 简单模式 3.2 Work que ...

  8. RabitMQ系列之 Spring RabbitMQ流量削锋实现案例之抢红包

    一.案例说明:电商的秒杀和抢购,对我们来说,都不是一个陌生的东西.然而,从技术的角度来说,这对于Web系统是一个巨大的考验,我们都知道,秒杀类,抢购类应用都有一个共同点,即瞬时请求巨大.本文中用一个多 ...

  9. SpringBoot整合RabbitMQ(六大消息模式、消息手动应答机制)

    目录 1.环境搭建 2.队列模式 3.发布订阅模式 4.路由模式 5.主题模式 6.消息手动应答机制 7.回调函数-确认机制(发布确认模式) 1.环境搭建 引入pom: <!-- rabbitM ...

  10. 基于SpringCloud开发rabbitmq五种工作模式实现

    工作模式 1. RabbitMQ消息模型 2. SpringAMQP 2.1. Basic Queue 简单队列模型 2.1.1.消息发送 2.1.2.消息接收 2.1.3.测试 2.2. WorkQ ...

最新文章

  1. FTP服务器的搭建及简单应用
  2. python3 配置文件操作库 configparser 读取配置文件后 元组列表转字典
  3. linux安卓双系统板子,安卓迷你 PC 主机只要 109 美元,支持 Android 和 Linux 双系统...
  4. 一分钟学会看k线图_K线图怎么看?一分钟学会看K线图
  5. C和指针之const、#define、volatile
  6. Hystrix简介– Hello World
  7. OpenGL模板测试通俗理解
  8. Eclipse中使用Checkstyle,checkstyle插件检查java代码的自定义配置文件:
  9. BetterZip使用教程分享:Mac用户如何提取压缩文件?
  10. jquery 找不到live方法解决
  11. C语言复杂声明解读简明方法
  12. Android 代码动态生成ProgressBar
  13. 张量(tensor)的理解
  14. 《FLUENT 14流场分析自学手册》——2.3 FLUENT14.5软件包的安装以及运行
  15. silvaco AMS安装方法
  16. PyQt设置右下角弹窗(转)
  17. L'Hospital法则
  18. warning C4183: ‘Cricle‘: member function definition looks like a ctor, but name does not match enclo
  19. html中的matrix属性,transform,matrix属性讲解
  20. matlab 切比雪夫矩源代码,matlab实现快速切比雪夫微分

热门文章

  1. matlab画网格等高线,matlab绘制网格图
  2. BZOJ3097Hash Killer I
  3. Python四六级考试,快来测试一下自己的编程水平吧
  4. win7电脑插音响没声音的解决教程--win10专业版
  5. Supermicro 1024US-TRT 服务器评测:1U 机箱中的 128 个内核
  6. apache 二级域名设置完整步骤
  7. arm开发板无法使用dns解析问题
  8. 查看电脑ip地址、查看手机ip地址、根据域名查看ip地址
  9. 打发时间的网站,收藏起来吃鸡玩腻了玩玩这些,够你玩一年
  10. 彻底关闭Chrome浏览器自动更新