rabbitmq學習固然是跟着官網走最好了,官網的教程寫的很好,跟着官網教程走一遍就會有個初步瞭解了java
下面的教程轉自http://cmsblogs.com/?p=2768,該博客對官網的翻譯還不錯python
RabbitMQ 是一個消息代理:它接受並轉發消息。你能夠將其視爲郵局:當你將要發佈的郵件放在郵箱中時,您能夠確信 Postman 先生最終會將郵件發送給收件人。在這個比喻中,RabbitMQ 是一個郵箱,郵局和郵遞員。git
RabbitMQ 和郵局之間的主要區別在於它不處理紙張,而是接受,存儲和轉發二進制數據塊的消息。github
RabbitMQ 使用一些術語:生產者、隊列、消費者。數組
一個發送消息的程序是一個生產者。ide
隊列相似於郵箱。雖然消息經過 RabbitMQ 在你的應用中傳遞,可是它們只能存儲在隊列中。隊列只受主機的內存和磁盤限制的限制,它本質上是一個大的消息緩衝區。不一樣的生產者能夠經過同一個隊列發送消息,此外,不一樣的消費者也能夠從同一個隊列上接收消息。學習
一個等待接收消息的程序是一個消費者。spa
整個過程很是簡單,生產者建立消息,消費者接收這些消息。你的應用程序既能夠做爲生產者向其餘應用程序發送消息,也能夠做爲消費者,等待接收其餘應用程序的消息。其中,存儲消息的是消息隊列,它相似於郵箱,消息經過消息隊列進行投遞。翻譯
在本教程的這一部分,咱們將用 Java 編寫一個 「Hello World」 的消息傳遞案例,它涉及兩個程序:發送單個消息的生產者,以及接收消息並將其打印出來的消費者。代理
在下圖中,「P」是咱們的生產者,「C」是咱們的消費者。中間的框是隊列 – RabbitMQ 表明消費者的消息緩衝區。
使用 Maven 進行依賴管理。
<dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId> <version>5.6.0</version> </dependency>
咱們會調用生產者發送消息給消費者。生產者鏈接到 RabbitMQ,發送一條數據,而後退出
public class Send { private final static String QUEUE_NAME = "hello"; public static void main(String[] args) throws IOException, TimeoutException { // 建立鏈接 ConnectionFactory factory = new ConnectionFactory(); // 設置 RabbitMQ 的主機名 factory.setHost("localhost"); // 建立一個鏈接 Connection connection = factory.newConnection(); // 建立一個通道 Channel channel = connection.createChannel(); // 指定一個隊列 // queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments) // 參數1 queue :隊列名 // 參數2 durable :是否持久化 默認false // 參數3 exclusive :僅建立者能夠使用的私有隊列,斷開後自動刪除 // 參數4 autoDelete : 當全部消費客戶端鏈接斷開後,是否自動刪除隊列 // 參數5 arguments channel.queueDeclare(QUEUE_NAME, false, false, false, null); // 發送消息 String message = "Hello World!"; // basicPublish(String exchange, String routingKey, BasicProperties props, byte[] body) // 參數1 exchange :交換器 // 參數2 routingKey : 路由鍵 // 參數3 props : 消息的其餘參數 // 參數4 body : 消息體 channel.basicPublish("", QUEUE_NAME, null, message.getBytes()); System.out.println(" [x] Sent '" + message + "'"); // 關閉頻道和鏈接 channel.close(); connection.close(); } }
聲明隊列是冪等的, 隊列只會在它不存在時纔會被建立,屢次聲明並不會重複建立。消息內容是一個字節數組,也就意味着能夠傳遞任何數據。
這就是咱們的消費者。它不斷等待消息隊列推送消息,而後在控制檯輸出。
public class Recv { private final static String QUEUE_NAME = "hello"; public static void main(String[] args) throws IOException, TimeoutException { // 建立鏈接 ConnectionFactory factory = new ConnectionFactory(); // 設置 RabbitMQ 的主機名 factory.setHost("localhost"); // 建立一個鏈接 Connection connection = factory.newConnection(); // 建立一個通道 Channel channel = connection.createChannel(); // 指定一個隊列 // queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments) // 參數1 queue :隊列名 // 參數2 durable :是否持久化 // 參數3 exclusive :僅建立者能夠使用的私有隊列,斷開後自動刪除 // 參數4 autoDelete : 當全部消費客戶端鏈接斷開後,是否自動刪除隊列 // 參數5 arguments channel.queueDeclare(QUEUE_NAME, false, false, false, null); System.out.println(" [*] Waiting for messages. To exit press CTRL+C"); // 建立隊列消費者 Consumer consumer = new DefaultConsumer(channel) { @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { String message = new String(body, "UTF-8"); System.out.println(" [x] Received '" + message + "'"); } }; // basicConsume(String queue, boolean autoAck, Consumer callback) // 參數1 queue :隊列名 // 參數2 autoAck : 是否自動ACK // 參數3 callback : 消費者對象的一個接口,用來配置回調 channel.basicConsume(QUEUE_NAME, true, consumer); } }