RabbitMQ客户端源码分析(九)之RPC请求响应

本文详细分析了RabbitMQ客户端实现RPC请求响应的源码,从队列声明到发送声明数据,再到读取RPC响应数据的核心流程。在发送声明中,通过同步RPC调用进行操作,限制了队列名字的最大长度。在读取响应时,使用Future对象阻塞等待服务端返回,并由单独线程处理响应数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

声明

  1. Queue声明、exchange声明、bind等,这些都是通过同步RPC调用

    
              
        channel.queueDeclare(queueName, durable, exclusive, autoDelete, null);
        channel.exchangeDeclare(exchange, "direct", true);  
        channel.queueBind(queueName, exchange, bindingKey);
    

发送声明数据

  1. queueDeclare:声明队列,调用的方法嵌套比较多
    rp-w489

  2. 核心调用流程

     校验队列名长度——>构建Declare数据——>RPC同步阻塞调用,直到响应数据返回
    
  3. validateQueueNameLength:从这里可以看到,队列名字的长度最大为255

        private static void validateQueueNameLength(String queue) {
         
         
            if(queue.length() > 255) {
         
         
               throw new IllegalArgumentException("queue name must be no more than 255 characters long");
            }
        }
    
    
  4. privateRpc:创建Future对象,调用rpc方法发送数据给服务端。k.getReply()阻塞等待直到connection.startMainLoop()启动的读线程读取到服务端返回的数据为止。

        private AMQCommand privateRpc(Method m)
            throws IOException, ShutdownSignalException
        {
         
         
            //封装BlockingValueOrException
            SimpleBlockingRpcContinuation k = new SimpleBlockingRpcContinuation();
            rpc(m, k);
            // At this point, the request method has been sent, and we
            // should wait for the reply to arrive.
            //
            // Calling getReply() on the continuation puts us to sleep
            // until the connection's reader-thread throws the reply over
            // the fence.
            return k.getReply();
        }
        
        public void rpc(Method m, RpcContinuation k)
        throws IOException {
         
         
            synchronized (_channelMutex) {
         
         
                ensureIsOpen();
                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值