rabbitmq学习:远程结果调用

Stark_Tan Stark_Tan     2022-09-08     593

关键词:

 

场景:我们需要在传输消息时得到结果

客服端在发送请求时会发送回调队列,服务端处理事情完成后会将结果返回到回调队列中,在增加关联标志关联每个请求和服务返回

客户端代码:

public class RPCClient {
    private final static String RPC_Queue_Name = "rpc_queue";
    public static void main(String[] args) throws IOException, TimeoutException, InterruptedException {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();
        //声明队列
       
channel.queueDeclare(RPC_Queue_Name, false, false, false, null);

        //为每一个客户端获取一个随机的回调队列
       
String replyQueueName = channel.queueDeclare().getQueue();
        //为每一个客户端创建一个消费者(用于监听回调队列,获取结果)
       
QueueingConsumer consumer = new QueueingConsumer(channel);
        //消费者与队列关联
       
channel.basicConsume(replyQueueName, true, consumer);

        String response = null;
        String corrId = java.util.UUID.randomUUID().toString();

        //设置replyTocorrelationId属性值
       
AMQP.BasicProperties props = new AMQP.BasicProperties.Builder().correlationId(corrId).replyTo(replyQueueName).build();

        //发送消息到rpc_queue队列
       
channel.basicPublish("", RPC_Queue_Name, props, "8".getBytes());

        while (true) {
            QueueingConsumer.Delivery delivery = consumer.nextDelivery();
            if (delivery.getProperties().getCorrelationId().equals(corrId)) {
                response = new String(delivery.getBody(),"UTF-8");
                break;
            }
        }
        System.out.println( "fib(8) is " + response);
    }
}

服务端代码:

public class RPCServer {
    private final static String RPC_Queue_Name = "rpc_queue";
    public static void main(String[] args) throws IOException, TimeoutException, InterruptedException {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();      channel.queueDeclare(RPC_Queue_Name,false,false,false,null);
        channel.basicQos(1);
        QueueingConsumer consumer = new QueueingConsumer(channel);
        channel.basicConsume(RPC_Queue_Name, false, consumer);
        System.out.println(" [x] Awaiting RPC requests");
        while (true) {
            QueueingConsumer.Delivery delivery = consumer.nextDelivery();
            //获取请求中的correlationId属性值,并将其设置到结果消息的correlationId属性中
           
BasicProperties props = delivery.getProperties();
            AMQP.BasicProperties replyProps = new AMQP.BasicProperties.Builder().correlationId(props.getCorrelationId()).build();
            //获取回调队列名字
           
String callQueueName = props.getReplyTo();

            String message = new String(delivery.getBody(),"UTF-8");

            System.out.println(" [.] fib(" + message + ")");

            //获取结果
           
String response = "" + fib(Integer.parseInt(message));
            //先发送回调结果
           
channel.basicPublish("", callQueueName, replyProps,response.getBytes());
            //后手动发送消息反馈
           
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
        }
    }

    private static int fib(int i)
    {
        if(i==0) return 0;
        if (i==1) return 1;
        return fib(i-1) +fib(i-2);
    }
}

rabbitmq系列教程之六:远程过程调用(rpc)

...常称为远程过程调用或RPC。 在本教程中,我们将使用RabbitMQ构建一个RPC系统:一 查看详情

rabbitmq学习:利用rabbitmq实现远程rpc调用(代码片段)

一、rabbitmq实现rpc调用的原理·rabbitmq实现rpc的原理是:客户端向一个队列中发送消息,并注册一个回调的队列用于接收服务端返回的消息,该消息需要声明一个叫做correaltionId的属性,该属性将是该次请求的唯一标识。服务端在... 查看详情

rabbitmq_rpc

...式通常称为远程过程调用或RPC。在本教程中,我们将使用RabbitMQ构建一个RPC系统:一个客户端和一个可扩展的RPC服务器。由于我们没有任何值得分发的耗时任务,我们将创建一个返回斐波纳契数字的虚拟RPC服务。客户端界面为了 查看详情

rpc使用rabbitmq实现

...在本地实现测试学习双向连接客户端和服务端配置:连接rabbitmq服务器定义消息队列配置发送请求的模板:交换机、消息队列。配置监听处理:监听的队列、消息转换处理配置处理类:处理类、发布的接口。RPC,全称为RemoteProcedu... 查看详情

rabbitmq远程执行任务rpc。(代码片段)

如果想发一条命令给远程机器,再把结果返回这种模式叫RPC:远程过程调用发送方将发送的消息放在一个queue里,由接收方取。接收方再把执行结果放在另外一个queue里,由发送方取实际上,发送方把1,随机生成的接收queue名2,U... 查看详情

springboot|rabbitmq实现rpc方式远程同步调用

上篇相关文章 Springboot项目整合Rabbitmq详细教程服务端代码示例@ResourceprivateRabbitTemplaterabbitTemplate;/***同步 对外发送消息的方法*@parammsg 具体的消息内容*@throwsException*/publicStringsyncSend(Stringmsg)MessagePropertiesme 查看详情

springboot|rabbitmq实现rpc方式远程同步调用

上篇相关文章 Springboot项目整合Rabbitmq详细教程服务端代码示例@ResourceprivateRabbitTemplaterabbitTemplate;/***同步 对外发送消息的方法*@parammsg 具体的消息内容*@throwsException*/publicStringsyncSend(Stringmsg)MessagePropertiesme 查看详情

rabbitmq九:远程过程调用rpc

定义RPC(RemoteProcedureCallProtocol)——远程过程调用协议:它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网... 查看详情

rabbitmq远程过程调用(rpc)(代码片段)

...待结果,我们通常叫这种模式为远程过程调用或者RPC.通过RabbitMQ进行RPC很容易,客户端发送请求消息,服务器回复响应消息.为了接收响应,我们需要发送带有“回调”队列地址的请求.同时,这里面涉及到几个比较重要的消息属性:消息... 查看详情

rabbitmq初探——用队列实现rpc

rabbitmq构造rpc前言 rpc——remoteprocedurecall远程调用。在我接触的使用过http协议、thrift框架来实现远程调用。其实消息队列rabbitmq也可以实现。 原理 我们称调用远程服务者为Client,远程服务提供者为Server。Client充当生产... 查看详情

rabbitmq——rpc

RabbitMQ(六)——RPC (转载请附上本文链接——linhxx)  一、概述RabbitMQ的RPC模式,支持生产者和消费者不在同一个系统中,即允许远程调用的情况。通常,消费者作为服务端,放置在远程的系统中,提供接口,生产... 查看详情

rabbitmq学习--rabbitmq的其他知识点(代码片段)

RabbitMQ幂等性概念用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。举个最简单的例子,那就是支付,用户购买商品后支付,支付扣款成功,但是返回结果的... 查看详情

rabbitmq学习--rabbitmq的其他知识点(代码片段)

RabbitMQ幂等性概念用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。举个最简单的例子,那就是支付,用户购买商品后支付,支付扣款成功,但是返回结果的... 查看详情

springboot+rabbitmq实现rpc调用(代码片段)

...都是RESTfulAPI、Dubbo、WebService、JavaRMI、CORBA等。其实,RabbitMQ也给我们提供了RPC功能,并且使用起来很简单。今天松哥通过一个简单的案例来和大家分享一下SpringBoot+RabbitMQ如何实现一个简单的RPC调用。注意关于RabbitMQ实... 查看详情

springboot+rabbitmq实现rpc调用(代码片段)

...都是RESTfulAPI、Dubbo、WebService、JavaRMI、CORBA等。其实,RabbitMQ也给我们提供了RPC功能,并且使用起来很简单。今天松哥通过一个简单的案例来和大家分享一下SpringBoot+RabbitMQ如何实现一个简单的RPC调用。注意关于RabbitMQ实... 查看详情

Laravel Queue Worker、RabbitMQ 和远程生成的运行作业

】LaravelQueueWorker、RabbitMQ和远程生成的运行作业【英文标题】:LaravelQueueWorker,RabbitMQandrunningjobsgeneratedremotely【发布时间】:2017-12-0621:39:50【问题描述】:我先承认有轻微的睡眠不足。设置如下:API端点(服务器A)接收传入调用... 查看详情

rabbitmq学习----工作队列模式(代码片段)

文章目录RabbitMQ学习(四)----工作队列模式(1)公平竞争机制(2)能者多劳机制autoAck取消,手动确认chanel传递1条数据(3)能者多劳的代码案例1、生产者2、消费者13、消费者24、查看接收结果RabbitMQ学习&... 查看详情

rabbitmq学习----工作队列模式(代码片段)

文章目录RabbitMQ学习(四)----工作队列模式(1)公平竞争机制(2)能者多劳机制autoAck取消,手动确认chanel传递1条数据(3)能者多劳的代码案例1、生产者2、消费者13、消费者24、查看接收结果RabbitMQ学习&... 查看详情