RabbitMQ消息隊列

1.相關術語

Producer(生產者):發送消息的一方。服務器

Consumer(消費者):接收消息的一方。url

Broker(消息中間件的服務節點:rabbitmq服務器, 生產者將消息發佈到broker中, 消費者從broker中訂閱消息spa

RoutingKey(路由鍵):生產者將消息發送到交換器的時候會指定一個RoutingKey,用來指定路由規則,且Routingkey要與交換器類型和BindingKey(綁定鍵) 聯合使用才能生效。代理

Binding(綁定):將交換器和隊列關聯起來,綁定的時候通常會指定一個綁定鍵,這樣rabbitmq就知道如何正確將消息路由到隊列了。code

Queue(隊列):存儲消息的緩衝區。中間件

Exchange(路由器/交換器):接收生產者發來的消息,並將這些消息推送到隊列中。blog

Exchange一共有四種類型:fanout,direct,topic,header 。rabbitmq

  • Fanout:會把全部發送到該交換器的消息路由到全部與該交換器綁定的隊列中。
  • Direct:會把消息路由到哪些BindingKey和 RoutingKey徹底匹配的隊列中
  • Topic:direct類型交換器相似不一樣之處在於在匹配BindingKey和 RoutingKey的規則上作了擴展
  • Headers:根據發送的消息內容中的headers屬性進行匹配

Publish/Subscribe(發佈訂閱模式):一個消息能夠發送到多個消費者中。隊列

2.經常使用方法

1)鏈接到RabbitMQ(AMQP代理)ip

  方法1:設定參數鏈接

ConnectionFactory factory = new ConnectionFactory();
factory.setUsername(userName);//用戶名
factory.setPassword(password);//密碼
factory.setVirtualHost(virtualHost);//虛擬主機
factory.setHost(hostName);//主機名
factory.setPort(portNumber);//端口號
Connection connection= factory.newConnection();

  方法2:經過url鏈接

ConnectionFactory factory = new ConnectionFactory();
factory.setUri("amqp://username:password@ipAdress:portNum/virtualhost");
Connection connection= factory.newConnection();

2)建立通道

Channel channel=connection.createChannel();

3)聲明消息隊列

channel.queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete,Map<String, Object> arguments);
  • durable:設置是否持久化持久化可將交換器存盤,服務器重啓不會丟失相關信息true、false true:在服務器重啓時,可以存活
  • exclusive:是否爲當前鏈接的專用隊列在鏈接斷開後,會自動刪除該隊列。
  • autodelete:是否自動刪除當沒有任何消費者使用時,自動刪除該隊列。
  • Arguments:設置隊列的其餘一些參數: 好比x-message-ttl

4)聲明交換機

channel.exchangeDeclare(String exchange, String type, boolean durable, boolean autoDelete);
  • type:direct、fanout、topic三種

5)綁定交換機和隊列。

channel.queueBind(String queue, String exchangeName, routingKey);
  • routingKey:路由鍵,#匹配0個或多個單詞,*匹配一個單詞,在topic exchange作消息轉發用

6)發佈消息

channel.basicPublish(String exchange, String routingKey, BasicProperties props, byte[] body);
  • props:消息的基本屬性,其中包括14個屬性成員       
  • body:消息體(payload) 真正須要發送的消息

7)收消息

channel.basicConsume(String queue,boolean autoAck, Consumer callback);
  • autoAck:是否自動確認消息,true自動確認,false要手動調用
  • callback:消費者 DefaultConsumer創建使用,重寫其中的方法
相關文章
相關標籤/搜索