RabbitMQ RFC同步调用是使用了两个异步调用完成的,生产者调用消费者的同时,自己也作为消费者等待某一队列的返回消息,消费者接受到生产者的消息同时,也作为消息发送者发送一消息给生产者。参考下图:


调用流程如下:

其他的消息服务器实现同步调用也是类似的原理,比如ActiveMQ。
下面编写消费者类Server

生产者Client代码

启动一命令行,将当前目录转移到项目所在的目录
在Eclipse中运行Client
代码:
package com.test.rfc;
import java.io.IOException;
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Consumer;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
public class Server {
public static void main(String[] argv) {
ConnectionFactory factory = new ConnectionFactory();
factory.setUsername("admin");
factory.setPassword("admin");
factory.setHost("192.168.169.142"); //使用默认端口5672
Connection connection = null;
try {
connection = factory.newConnection();
final Channel channel = connection.createChannel();
String queueName = "queue_rpc";
channel.queueDeclare(queueName, false, false, false, null);
Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag,
Envelope envelope, AMQP.BasicProperties properties,
byte[] body) throws IOException 
{
System.out.println("test1" + new String(body));
AMQP.BasicProperties replyProps = new AMQP.BasicProperties.Builder()
.correlationId(properties.getCorrelationId())
.build();
String response = "hello client,I'm rfc server";
channel.basicPublish("", properties.getReplyTo(),
replyProps, response.getBytes());
channel.basicAck(envelope.getDeliveryTag(), false);
}
};
channel.basicConsume(queueName, false, consumer);
} catch (IOException e) {
e.printStackTrace();
}
}
}

package com.test.rfc;
import java.io.IOException;
import java.util.UUID;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import com.rabbitmq.client.*;
public class Client {
public static void main(String[] argv) {
try
{
//发送消息的队列,Server在这个队列上接受消息
String queueName = "queue_rpc";
ConnectionFactory factory = new ConnectionFactory();
factory.setUsername("admin");
factory.setPassword("admin");
factory.setHost("192.168.169.142"); //使用默认端口5672
Connection connection = null;
connection = factory.newConnection();
Channel channel = connection.createChannel();
//生成临时的队列,Client在这队列上等待Server返回信息,Server向这个队列发消息
String replyQueueName = channel.queueDeclare().getQueue();
//生成唯一ID
final String corrId = UUID.randomUUID().toString();
AMQP.BasicProperties props = new AMQP.BasicProperties.Builder()
.correlationId(corrId).replyTo(replyQueueName).build();
//客户端发送RFC请求
channel.basicPublish("", queueName, props, "GetUserInfo".getBytes());
//Server返回消息
final BlockingQueue response = new ArrayBlockingQueue(1);
channel.basicConsume(replyQueueName, true,
new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag,
Envelope envelope, AMQP.BasicProperties properties,
byte[] body) throws IOException {
System.out.println(properties.getCorrelationId());
if (properties.getCorrelationId().equals(corrId)) {
response.offer(body);
}
}
});
byte[] b = response.take();
System.out.println(new String(b));
channel.close();
connection.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}

转载于:https://www.cnblogs.com/zzpblogs/p/8168805.html

7.RabbitMQ RFC同步调用相关推荐

  1. 精通RabbitMQ之RPC同步调用

    精通RabbitMQ之RPC同步调用 前面我们对应用解耦做过分析,我们能够使用消息中间件来完成应用解耦,很大一部分原因是因为我们的系统之间可以异步处理并且不关心结果回执.假如我们现在需要异步处理的结果 ...

  2. google的api key调用次数是多少_Sprint Boot如何基于Redis发布订阅实现异步消息系统的同步调用?...

    前言 在很多互联网应用系统中,请求处理异步化是提升系统性能一种常用的手段,而基于消息系统的异步处理由于具备高可靠性.高吞吐量的特点,因而在并发请求量比较高的互联网系统中被广泛应用.与此同时,这种方案也 ...

  3. ABAP RFC远程调用

    RFC 可以在SAP系统之间.SAP系统与非SAP系统之间进行远程调用,且调用可以是双向的(SAP系统可以调用非SAP系统.非SAP系统也可以调用SAP系统--如Java通过Jco连接器来访问SAP) ...

  4. 同步调用和异步调用两者之间的区别

    前言   提到同步调用和异步调用两者的区别,首先笔者是从微服务间通讯方式角度出发来阐述这两者的区别. 同步通讯 调用方需要等待执行方的调用结果.(就像打电话一样,需要实时响应) 典型就是:Dubbo的 ...

  5. Alibaba Dubbo框架同步调用原理分析-1

    2019独角兽企业重金招聘Python工程师标准>>> 由于Dubbo底层采用Socket进行通信,自己对通信理理论也不是很清楚,所以顺便把通信的知识也学习一下. n  通信理论 计 ...

  6. Alibaba Dubbo框架同步调用原理分析-2

    2019独角兽企业重金招聘Python工程师标准>>> 接上一篇,看一下Dubbo的相关代码 关键代码: com.taobao.remoting.impl.DefaultClient ...

  7. 异步调用可以转化为同步调用吗?

    源起 小飞是一名刚入行前端不久的新人,因为进到了某个大公司,俨然成为了学弟学妹眼中'大神',大家遇到js问题都喜欢问他,这不,此时他的qq弹出了这样一条消息 "hi,大神在吗?我有个问题想问 ...

  8. java同步转化成异步_Java 如何把异步调用模拟成同步调用

    在某些时候,须要把异步调用模拟成同步调用的形态.例如,基于基于异步通讯的客户端须要同步调用. :-)异步 要实现这个转换,能够有多种实现方法:this 1.很经常使用的方法,应用循环机制:spa bo ...

  9. mqtt 发送消息过多_阿里云MQTT服务端注解式消息处理分发与同步调用实践小结

    一.前言 前段时间公司预研了设备app端与服务端的交互方案,出于多方面考量最终选用了阿里云的微服务队列MQTT方案,基于此方案,本人主要实践有: 1. 封装了RocketMQ实现MQTT订阅与发布的实 ...

最新文章

  1. SpringMVC 学习笔记(五) 基于RESTful的CRUD
  2. 求连通块个数(使用并查集)
  3. 【通知】3月当当购书大额优惠券赠送,仅限今明两天
  4. 精益数据分析 | 你孜孜追求的“增长”可能只是自嗨
  5. postman测试带权限接口_接口测试工具:postman
  6. vue-cli构建的项目手动添加eslint配置
  7. 获取hdfs_收好!Hadoop-HDFS读写原理的超详细教程
  8. 与孩子一起学编程04章
  9. [渝粤教育] 重庆大学 房屋建筑学 参考 资料
  10. 测试计划报告---5W1H
  11. 彻底搞懂瓦片地图拼接原理并附具体实现
  12. 华为服务器怎么查看系统日志,云服务器怎么查看系统日志
  13. 天津大学仁爱学院计算机科学与技术学费,天津大学仁爱学院计算机科学与技术专业2016年在山西理科高考录取最低分数线...
  14. Android scroller控件,Android Scroller完全解析
  15. window10 电脑总是会从睡眠模式中自动唤醒
  16. 鸿蒙开发板hi3861 hispark code 2.0 canary金丝雀版本,gpio如何上拉电阻呢?
  17. RMAN Encrypted Backups
  18. 人工智能入门:第一章 人工智能课程介绍及环境配置
  19. iOS_Tagged Pointer是什么,结构
  20. 美股互联网IPO集散地,正在成为过去式

热门文章

  1. 基于FCN,U-Net的深度学习医学影像分割算法(细胞分割算法)以及传统算法分析
  2. 《一起学习rgbdSLAM》中g2o部分报错的问题
  3. Linux终端运行fasterrcnn,对yolo与fasterrcnn anchors的理解
  4. android 字幕,Android中的字幕文本
  5. ssm开发框架原理_SSM 单体框架 - 前端开发:视频讲解
  6. sqlmap使用_sqlmap从入门到精通第四章47使用EW代理导出和导入MSSQL数据
  7. php if require,php echo()和print()、require()和include()函数区别说明
  8. redmine mysql配置_Redmine安装指南一:railsinstaller+apache+mysql(推荐)
  9. 面板服务器默认是什么系统,免费Linux服务器管理面板,你用的是哪个?
  10. 如果有的明星不会使用计算机,盘点娱乐圈不会用电脑手机的10大原始明星:最后一位出书都是手写...