spring-rabbitmq Direct reply-to 模式
前言
rabbitmq提供了request/reply模式,通过这种模式可以比较轻松的实现rpc,我们可以拿到消费者的返回,通过replytimeout设置超时时间,如果超时返回null。
一、普通request/response模式
- client将消息传递个消息服务,放入队列,消息头中包含reply_to(用于接收消息的排他队列),correlation_id(唯一的,与请求相关);
- server通过队列拿到消息,将消息放到名字为reply_to队列(可以是临时的,可以是持久的)
- 客户端从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 模式相关推荐
- rabbitmq direct 多个消费者_一文解析 RabbitMQ 最常用的三大模式
Direct 模式 所有发送到 Direct Exchange 的消息被转发到 RouteKey 中指定的 Queue. Direct 模式可以使用 RabbitMQ 自带的 Exchange: de ...
- RabbitMQ学习记录 - Direct之Routing模式
(内容均来自RabbitMQ官网:https://www.rabbitmq.com/tutorials/tutorial-four-java.html) 前面几篇学习了下RabbitMQ的" ...
- RabbitMQ的Routing 路由模式(Direct)
RabbitMQ的Routing 路由模式 模式说明: 队列与交换机的绑定,不能是任意绑定了,而是要指定一个 RoutingKey(路由key) 消息的发送方在向 Exchange 发送消息时,也必须 ...
- RabbitMq | springboot (路由模式RoutingKey)整合Direct交换器
生产者发送消息到交换机并指定一个路由key,消费者队列绑定到交换机时要制定路由key(key匹配就能接受消息,key不匹配就不能接受消息) 引入依赖: <dependency><gr ...
- rabbitmq direct reply-to 在springAMQP和python之间的使用
背景 公司的一个项目使用rabbitmq作为broker进行交互,并且数据的查询方法使用RPC模式,RPC Client端使用java编写并使用springAMQP包与rabbitmq交互,在RPC ...
- rabbitmq direct 多个消费者_RabbitMQ实战应用技巧
1. RabbitMQ实战应用技巧 1.1. 前言 由于项目原因,之后会和RabbitMQ比较多的打交道,所以让我们来好好整理下RabbitMQ的应用实战技巧,尽量避免日后的采坑 1.2. 概述 Ra ...
- Rabbitmq专题:springboot如何整合Rabbitmq?Rabbitmq有哪些工作模式?
文章目录 1. Rabbitmq的安装 2. Rabbitmq的基本概念 3. RabbitMQ的工作模式 3.1 "Hello World!" 简单模式 3.2 Work que ...
- RabitMQ系列之 Spring RabbitMQ流量削锋实现案例之抢红包
一.案例说明:电商的秒杀和抢购,对我们来说,都不是一个陌生的东西.然而,从技术的角度来说,这对于Web系统是一个巨大的考验,我们都知道,秒杀类,抢购类应用都有一个共同点,即瞬时请求巨大.本文中用一个多 ...
- SpringBoot整合RabbitMQ(六大消息模式、消息手动应答机制)
目录 1.环境搭建 2.队列模式 3.发布订阅模式 4.路由模式 5.主题模式 6.消息手动应答机制 7.回调函数-确认机制(发布确认模式) 1.环境搭建 引入pom: <!-- rabbitM ...
- 基于SpringCloud开发rabbitmq五种工作模式实现
工作模式 1. RabbitMQ消息模型 2. SpringAMQP 2.1. Basic Queue 简单队列模型 2.1.1.消息发送 2.1.2.消息接收 2.1.3.测试 2.2. WorkQ ...
最新文章
- FTP服务器的搭建及简单应用
- python3 配置文件操作库 configparser 读取配置文件后 元组列表转字典
- linux安卓双系统板子,安卓迷你 PC 主机只要 109 美元,支持 Android 和 Linux 双系统...
- 一分钟学会看k线图_K线图怎么看?一分钟学会看K线图
- C和指针之const、#define、volatile
- Hystrix简介– Hello World
- OpenGL模板测试通俗理解
- Eclipse中使用Checkstyle,checkstyle插件检查java代码的自定义配置文件:
- BetterZip使用教程分享:Mac用户如何提取压缩文件?
- jquery 找不到live方法解决
- C语言复杂声明解读简明方法
- Android 代码动态生成ProgressBar
- 张量(tensor)的理解
- 《FLUENT 14流场分析自学手册》——2.3 FLUENT14.5软件包的安装以及运行
- silvaco AMS安装方法
- PyQt设置右下角弹窗(转)
- L'Hospital法则
- warning C4183: ‘Cricle‘: member function definition looks like a ctor, but name does not match enclo
- html中的matrix属性,transform,matrix属性讲解
- matlab 切比雪夫矩源代码,matlab实现快速切比雪夫微分