文章目录
声明
-
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();