RabbitMQ之入門HelloWorld(Java)

我的個人博客網站雲諾說上線啦!所有文章都搬到新地址了,點擊圍觀吧!

RabbitMQ簡介

RabbitMQ是消費-生產者模型的一個典型的代表,一端往消息隊列中不斷寫入消息,而另一端則可以讀取或者訂閱隊列中的消息。它是一個實現了AMQP協議的可複用的企業消息系統。RabbitMQ是用Erlang開發。那麼RabbitMQ也具備容錯,熱更新,分佈式緩存,持久化等特點。RabbitMQ可以輕鬆的搭建出大型可用的分佈式隊列消息集羣。

 

RabbitMQ的結構圖:

 

RabbitMQ的一些概念:

Broker:簡單來說就是消息隊列服務器實體。
Exchange:消息交換機,它指定消息按什麼規則,路由到哪個隊列。
Queue:消息隊列載體,每個消息都會被投入到一個或多個隊列。
Binding:綁定,它的作用就是把exchange和queue按照路由規則綁定起來。
Routing Key:路由關鍵字,exchange根據這個關鍵字進行消息投遞。
vhost:虛擬主機,一個broker裏可以開設多個vhost,用作不同用戶的權限分離。
producer:消息生產者,就是投遞消息的程序。
consumer:消息消費者,就是接受消息的程序。
channel:消息通道,在客戶端的每個連接裏,可建立多個channel,每個channel代表一個會話任務。

 

RabbitMQ是用Erlang開發的,但對於主要的編程語言都有驅動或者客戶端。我們這裏要用的是Java來作爲客戶端語言。假設都已經搭建好環境了(沒有的話看這裏),首先我們下載Java客戶端類庫,點擊這裏,下圖是例子的模型:

首先創建隊列,生產者向隊列發送消息,消費者向隊列取出消息,過程很簡單,下面正式開始吧~~

步驟如下:

(一)創建訪問用戶

 

[root@localhost sbin]# ./rabbitmqctl add_user test test
Creating user "test" ...

(二)給用戶綁定vhost並添加權限

 

 

[root@localhost sbin]# ./rabbitmqctl set_permissions -p "/" test ".*" ".*" ".*"          
Setting permissions for user "test" in vhost "/" ...

這裏就綁定默認的vhost“/”,也可以自己通過 ./rabbitmqctl add_vhost xx 來添加

 

(三)編寫生產者程序並啓動

 

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

public class HelloWorldProducer {
    
    private final static String QUEUE_NAME = "hello";

    public static void main(String[] args) throws Exception{
        ConnectionFactory cf = new ConnectionFactory();
        //rabbitmq監聽IP
        cf.setHost("192.168.1.96");
        //rabbitmq默認監聽端口,注意要記得開啓端口
        cf.setPort(5672);
        
        //設置訪問的用戶
        cf.setUsername("test");
        cf.setPassword("test");
        //建立連接
        Connection conn = cf.newConnection();
        //創建消息通道
        Channel channel = conn.createChannel();

        String msg = "hello world!!!! 你好啊~";
        //創建hello隊列
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        
        //發送消息
        channel.basicPublish("", QUEUE_NAME, null, msg.getBytes());
        System.out.println("send msg "+ msg + " to ["+ QUEUE_NAME +"] queue !");
        
        channel.close();
        conn.close();

    }

}

可以看到hello隊列裏有一條消息了

[root@localhost sbin]# ./rabbitmqctl list_queues -p "/"
Listing queues ...
hello   1
[root@localhost sbin]# 

(四)編寫消費者程序並啓動

 

import java.io.IOException;
import java.util.concurrent.TimeoutException;
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Consumer;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;

public class HelloWorldConsumer {

    private final static String QUEUE_NAME = "hello";
    public static void main(String[] args) throws IOException, TimeoutException {

        ConnectionFactory cf = new ConnectionFactory();
        //rabbitmq監聽IP
        cf.setHost("192.168.1.96");
        //rabbitmq默認監聽端口,注意要記得開啓端口
        cf.setPort(5672);
        
        //設置訪問的用戶
        cf.setUsername("test");
        cf.setPassword("test");
        //建立連接
        Connection conn = cf.newConnection();
        //創建消息通道
        Channel channel = conn.createChannel();

        //創建hello隊列
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        System.out.println(" Waiting for msg....");
        //創建消費者,並接受消息
        Consumer consumer = new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body)
                    throws IOException {
                String msg = new String(body, "UTF-8");
                System.out.println("Received is = '" + msg + "'");
            }
        };
        channel.basicConsume(QUEUE_NAME, true, consumer);
    }

}

運行結果:
這時隊列裏的消息被消費掉了

 

 

 

 

[root@localhost sbin]# ./rabbitmqctl list_queues -p "/"
Listing queues ...
hello   0
[root@localhost sbin]# 

如果不成功可能是一下幾點造成的:

 

 

  • 如果連接不成功可能是IP不對或者是5672端口沒開啓,可以在rabbitmq.config中修改(默認是{tcp_listeners, [{"127.0.0.1",5672}]})
  • 如果用guest(默認用戶)訪問,監聽Host則必須是localhost
  • 如果是新創建的用戶,記得給用戶綁定vhost並添加權限
  • 可以從RabbitMQ的日誌文件 [email protected] ,獲取更多詳細的錯誤信息

祝生活愉快!!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章