文章目录
声明
-
Queue声明、exchange声明、bind等,这些都是通过同步RPC调用
channel.queueDeclare(queueName, durable, exclusive, autoDelete, null); channel.exchangeDeclare(exchange, "direct", true); channel.queueBind(queueName, exchange, bindingKey);
发送声明数据
-
queueDeclare:声明队列,调用的方法嵌套比较多

-
核心调用流程
校验队列名长度——>构建Declare数据——>RPC同步阻塞调用,直到响应数据返回 -
validateQueueNameLength:从这里可以看到,队列名字的长度最大为255private static void validateQueueNameLength(String queue) { if(queue.length() > 255) { throw new IllegalArgumentException("queue name must be no more than 255 characters long"); } } -
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();

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

被折叠的 条评论
为什么被折叠?



