在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Java  C/ rabbitMQ 的channel是不是跟quene_name是綁定的?

rabbitMQ 的channel是不是跟quene_name是綁定的?

rabbitMQ的客戶端代碼有如下示例:

package com.zhy.rabbit._01;  
  
import com.rabbitmq.client.Channel;  
import com.rabbitmq.client.Connection;  
import com.rabbitmq.client.ConnectionFactory;  
  
public class Send  
{  
    //隊(duì)列名稱  
    private final static String QUEUE_NAME = "hello";  
  
    public static void main(String[] argv) throws java.io.IOException  
    {  
        /** 
         * 創(chuàng)建連接連接到MabbitMQ 
         */  
        ConnectionFactory factory = new ConnectionFactory();  
        //設(shè)置MabbitMQ所在主機(jī)ip或者主機(jī)名  
        factory.setHost("localhost");  
        //創(chuàng)建一個(gè)連接  
        Connection connection = factory.newConnection();  
        //創(chuàng)建一個(gè)頻道  
        Channel channel = connection.createChannel();  
        //指定一個(gè)隊(duì)列  
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);  
        //發(fā)送的消息  
        String message = "hello world!";  
        //往隊(duì)列中發(fā)出一條消息  
        channel.basicPublish("", QUEUE_NAME, null, message.getBytes());  
        System.out.println(" [x] Sent '" + message + "'");  
        //關(guān)閉頻道和連接  
        channel.close();  
        connection.close();  
     }  
}  

接收的代碼:

package com.zhy.rabbit._01;  
  
import com.rabbitmq.client.Channel;  
import com.rabbitmq.client.Connection;  
import com.rabbitmq.client.ConnectionFactory;  
import com.rabbitmq.client.QueueingConsumer;  
  
public class Recv  
{  
    //隊(duì)列名稱  
    private final static String QUEUE_NAME = "hello";  
  
    public static void main(String[] argv) throws java.io.IOException,  
            java.lang.InterruptedException  
    {  
        //打開連接和創(chuàng)建頻道,與發(fā)送端一樣  
        ConnectionFactory factory = new ConnectionFactory();  
        factory.setHost("localhost");  
        Connection connection = factory.newConnection();  
        Channel channel = connection.createChannel();  
        //聲明隊(duì)列,主要為了防止消息接收者先運(yùn)行此程序,隊(duì)列還不存在時(shí)創(chuàng)建隊(duì)列。  
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);  
        System.out.println(" [*] Waiting for messages. To exit press CTRL+C");  
          
        //創(chuàng)建隊(duì)列消費(fèi)者  
        QueueingConsumer consumer = new QueueingConsumer(channel);  
        //指定消費(fèi)隊(duì)列  
        channel.basicConsume(QUEUE_NAME, true, consumer);  
        while (true)  
        {  
            //nextDelivery是一個(gè)阻塞方法(內(nèi)部實(shí)現(xiàn)其實(shí)是阻塞隊(duì)列的take方法)  
            QueueingConsumer.Delivery delivery = consumer.nextDelivery();  
            String message = new String(delivery.getBody());  
            System.out.println(" [x] Received '" + message + "'");  
        }  
  
    }  
}  

注意到 channel.queueDeclare(QUEUE_NAME, false, false, false, null); 這一句,好像rabbitMQ使用隊(duì)列時(shí),必須要將隊(duì)列的名稱綁定到channel之中。那么是不是說我們?cè)诠こ汤锩嫘枰ㄟ^connection創(chuàng)建出大量的channel,綁定到不同的quene_Name里面。因?yàn)槲覀児こ淘瓉淼慕涌谑沁@么寫的:

void send(String queneName,Object message);
Object get(String queneName);

是否意味著我需要維護(hù)一個(gè)Map,通過queneName映射到不同的channel,然后通過queneName拿到相應(yīng)的channel后再進(jìn)行寫入和取出的操作呢?

回答
編輯回答
網(wǎng)妓

不是。channel只是用來與隊(duì)列交互的一個(gè)東西,不能直接操作隊(duì)列。

  • 接收是在channel上訂閱指定的隊(duì)列消息
  • 發(fā)送一般是通過channel帶上routingKey發(fā)送到指定的exchange,exchange上根據(jù)routingKey綁定queue來決定發(fā)送到什么隊(duì)列
2017年9月26日 17:25