1. 程式人生 > >RabbitMQ初學之二:直接傳送訊息到佇列

RabbitMQ初學之二:直接傳送訊息到佇列

一. 背景

  總前提:佇列無論是在生產者宣告還是在消費者宣告,只有聲明瞭,才能在RabbitMQ的管理介面看到該佇列

  生產者直接傳送訊息到佇列,消費者直接消費佇列中的訊息,而不用指定exchange並繫結。這種需求下,分三種情況:① 生產者宣告佇列(指定佇列名稱),消費者不指定佇列,而是直接消費生產者指定的佇列;② 生產者聲指定佇列,但不宣告佇列,而是直接將訊息傳送到該佇列,消費生宣告該佇列,並從該佇列接收訊息;③ 生產者宣告佇列並將訊息傳送到該佇列,消費者也宣告該佇列,並從該佇列消費訊息,但是:生產者和消費者宣告佇列時指定的引數要一致,否則會報錯。下面分別進行說明:

1. 生產者宣告佇列(指定佇列名稱),消費者不指定佇列,而是直接消費生產者指定的佇列,但是此時,宣告佇列的一方要先執行,否則消費者連不上佇列,要報錯

  ① 生產者程式碼

 1 import java.io.IOException;
 2 import com.rabbitmq.client.Channel;
 3 import com.rabbitmq.client.Connection;
 4 import com.rabbitmq.client.ConnectionFactory;
 5  
 6 public class Producer {
 7     private final static String QUEUE_NAME = "QUEUE1";  
 8  
 9     public static void main(String[] args) throws
IOException { 10 ConnectionFactory factory = new ConnectionFactory(); 11 factory.setHost("localhost"); 12 factory.setUsername("guest"); 13 factory.setPassword("guest"); 14 factory.setPort(5672); 15 Connection connection = factory.newConnection();
16 Channel channel = connection.createChannel(); 17 18 // 宣告佇列 19 channel.queueDeclare(QUEUE_NAME, true, false, false, null); 20 String message = "Hello World!"; 21 22 // 發行訊息到佇列 23 channel.basicPublish("", QUEUE_NAME, null, message.getBytes()); 24 System.out.println(" [x] Sent '" + message + "'"); 25 26 channel.close(); 27 connection.close(); 28 } 29 }

  2. 消費者

 1 import com.rabbitmq.client.ConnectionFactory;  
 2 import com.rabbitmq.client.QueueingConsumer;  
 3 import com.rabbitmq.client.Channel;  
 4 import com.rabbitmq.client.Connection;  
 5 
 6 public class Reqv {
 7     
 8     private final static String QUEUE_NAME = "QUEUE1";  
 9       
10     public static void main(String[] argv) throws Exception {  
11         
12         ConnectionFactory factory = new ConnectionFactory();
13         factory.setUsername("guest");
14         factory.setPassword("guest");
15         factory.setHost("localhost");
16         factory.setPort(5672);  
17         
18         Connection connection = factory.newConnection();  
19         Channel channel = connection.createChannel();  
20         
21         System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
22         
23         QueueingConsumer consumer = new QueueingConsumer(channel);  
24         
25         // 消費者不宣告佇列,直接從佇列中消費
26         channel.basicConsume(QUEUE_NAME, true, consumer);  
27         while(true){  
28             QueueingConsumer.Delivery delivery = consumer.nextDelivery();  
29             String message = new String(delivery.getBody(),"UTF-8");  
30             System.out.println(" 【[x] Received 】:" + message);  
31         }  
32     }  
33 }

2.  生產者聲指定佇列,但不宣告佇列,而是直接將訊息傳送到該佇列,消費生宣告該佇列,並從該佇列接收訊息,生產者可先執行)(不報錯),但是發的訊息無效(被丟棄),只有宣告佇列的一方執行後,在管理介面才能看到該佇列

  ① 生產者

 1 import java.io.IOException;
 2 import com.rabbitmq.client.Channel;
 3 import com.rabbitmq.client.Connection;
 4 import com.rabbitmq.client.ConnectionFactory;
 5  
 6 public class Producer {
 7     private final static String QUEUE_NAME = "QUEUE2";  
 8  
 9     public static void main(String[] args) throws IOException {  
10         ConnectionFactory factory = new ConnectionFactory();  
11         factory.setHost("localhost");
12         factory.setUsername("guest");
13         factory.setPassword("guest");
14         factory.setPort(5672);
15         Connection connection = factory.newConnection();  
16         Channel channel = connection.createChannel();  
17  
18         String message = "Hello World!";  
19         
20         // 發行訊息到佇列
21         channel.basicPublish("", QUEUE_NAME, null, message.getBytes());  
22         System.out.println(" [x] Sent '" + message + "'");  
23  
24         channel.close();  
25         connection.close();  
26     }  
27 }

  ② 消費者

 1 import com.rabbitmq.client.ConnectionFactory;  
 2 import com.rabbitmq.client.QueueingConsumer;  
 3 import com.rabbitmq.client.Channel;  
 4 import com.rabbitmq.client.Connection;  
 5 
 6 public class Reqv {
 7     
 8     private final static String QUEUE_NAME = "QUEUE2";  
 9       
10     public static void main(String[] argv) throws Exception {  
11         
12         ConnectionFactory factory = new ConnectionFactory();
13         factory.setUsername("guest");
14         factory.setPassword("guest");
15         factory.setHost("localhost");
16         factory.setPort(5672);  
17         
18         Connection connection = factory.newConnection();  
19         Channel channel = connection.createChannel();  
20         
21         // 宣告佇列
22         channel.queueDeclare(QUEUE_NAME, true, false, false, null); 
23         System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
24         
25         QueueingConsumer consumer = new QueueingConsumer(channel);  
26         
27         // 消費者不宣告佇列,直接從佇列中消費
28         channel.basicConsume(QUEUE_NAME, true, consumer);  
29         while(true){  
30             QueueingConsumer.Delivery delivery = consumer.nextDelivery();  
31             String message = new String(delivery.getBody(),"UTF-8");  
32             System.out.println(" 【[x] Received 】:" + message);  
33         }  
34     }  
35 }

3. 生產者宣告佇列並將訊息傳送到該佇列,消費者也宣告該佇列,並從該佇列消費訊息,但是:生產者和消費者宣告佇列時指定的引數要一致,否則會報錯。

  ① 生產者

 1 import java.io.IOException;
 2 import com.rabbitmq.client.Channel;
 3 import com.rabbitmq.client.Connection;
 4 import com.rabbitmq.client.ConnectionFactory;
 5  
 6 public class Producer {
 7     private final static String QUEUE_NAME = "QUEUE2";  
 8  
 9     public static void main(String[] args) throws IOException {  
10         ConnectionFactory factory = new ConnectionFactory();  
11         factory.setHost("localhost");
12         factory.setUsername("guest");
13         factory.setPassword("guest");
14         factory.setPort(5672);
15         Connection connection = factory.newConnection();  
16         Channel channel = connection.createChannel();  
17  
18         // 宣告佇列
19         channel.queueDeclare(QUEUE_NAME, true, false, false, null);  
20         String message = "Hello World!";  
21         
22         // 發行訊息到佇列
23         channel.basicPublish("", QUEUE_NAME, null, message.getBytes());  
24         System.out.println(" [x] Sent '" + message + "'");  
25  
26         channel.close();  
27         connection.close();  
28     }  
29 }

  ② 消費者

 1 import com.rabbitmq.client.ConnectionFactory;  
 2 import com.rabbitmq.client.QueueingConsumer;  
 3 import com.rabbitmq.client.Channel;  
 4 import com.rabbitmq.client.Connection;  
 5 
 6 public class Reqv {
 7     
 8     private final static String QUEUE_NAME = "QUEUE2";  
 9       
10     public static void main(String[] argv) throws Exception {  
11         
12         ConnectionFactory factory = new ConnectionFactory();
13         factory.setUsername("guest");
14         factory.setPassword("guest");
15         factory.setHost("localhost");
16         factory.setPort(5672);  
17         
18         Connection connection = factory.newConnection();  
19         Channel channel = connection.createChannel();  
20         
21         // 宣告佇列
22         channel.queueDeclare(QUEUE_NAME, true, false, false, null); 
23         System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
24         
25         QueueingConsumer consumer = new QueueingConsumer(channel);  
26         
27         // 消費者不宣告佇列,直接從佇列中消費
28         channel.basicConsume(QUEUE_NAME, true, consumer);  
29         while(true){  
30             QueueingConsumer.Delivery delivery = consumer.nextDelivery();  
31             String message = new String(delivery.getBody(),"UTF-8");  
32             System.out.println(" 【[x] Received 】:" + message);  
33         }  
34     }  
35 }

相關推薦

RabbitMQ初學:直接傳送訊息佇列

一. 背景   總前提:佇列無論是在生產者宣告還是在消費者宣告,只有聲明瞭,才能在RabbitMQ的管理介面看到該佇列   生產者直接傳送訊息到佇列,消費者直接消費佇列中的訊息,而不用指定exchange並繫結。這種需求下,分三種情況:① 生產者宣告佇列(指定佇列名稱),消費者不指定佇列,而是直接消費生產者指

rabbitmq用法--直接傳送訊息佇列

rabbitmq 術語: ConnectionFactory、Connection、Channel都是RabbitMQ對外提供的API中最基本的物件。 Connection是RabbitMQ的socket連結,它封裝了socket協議相關部分邏輯。 ConnectionFa

Windows訊息機制(續)-- windows訊息訊息佇列

與基於MS - DOS的應用程式不同,Windows的應用程式是事件(訊息)驅動的。它們不會顯式地呼叫函式(如C執行時庫呼叫)來獲取輸入,而是等待windows向它們傳遞輸入。 windows系統把應用程式的輸入事件傳遞給各個視窗,每個視窗有一個函式,稱為視窗訊息處理函式。

RabbitMQ指南:工作佇列(Work Queues)

在上一章的指南中,我們寫了一個命名佇列:生產者往該命名佇列傳送訊息、消費從從該命名佇列中消費訊息。在本章中,我們將建立一個工作佇列

shell初學

bsp mage img 數組 shell數組 shell運算 .html -1 run 參考鏈接:http://www.runoob.com/linux/linux-shell-array.html。"Shell數組"、“Shell運算符”、“Shell echo命令”。

RabbitMQ系列 RabbitMQ安裝

上一篇文章簡單介紹了RabbitMQ,現在來安裝RabbitMQ Windows RabbitMQ安裝 1.進入官網下載RabbitMQ 官網地址:http://www.rabbitmq.com,進入後訪問getstart進入下載介面 選擇Windows版本 下載Erlang和Rab

SpringBoot開發案例整合Kafka實現訊息佇列

  前言   最近在做一款秒殺的案例,涉及到了同步鎖、資料庫鎖、分散式鎖、程序內佇列以及分散式訊息佇列,這裡對SpringBoot整合Kafka實現訊息佇列做一個簡單的記錄。   Kafka簡介   Kafka是由Apache軟體基金會開發的一個開源流處理平臺,由Scala和Java編寫

PHP 高階程式設計多執行緒-訊息佇列

1. 多執行緒環境安裝 1.1. PHP 5.5.9 安裝PHP 5.5.9 https://github.com/oscm/shell/blob/master/php/5.5.9.sh ./configure --prefix=/srv/php-5.5.9 \ --wi

Docker下RabbitMQ四部曲:細說RabbitMQ映象製作

本章是《Docker下RabbitMQ四部曲》系列的第二篇,將詳細簡述Docker下製作RabbitMQ映象的技術細節,包括以下內容: 1. 列舉製作RabbitMQ映象時用到的所有材料; 2. 編寫Dockerfile; 3. 編寫容器啟動時執行的指令碼

Modbus協議棧開發筆記:Modbus訊息幀的生成

前面我們已經對Modbus的基本事務作了說明,也據此設計了我們將要實現的主從站的操作流程。這其中與Modbus直接相關的就是Modbus訊息幀的生成。Modbus訊息幀也是實現Modbus通訊協議的根本。 1、Modbus訊息幀分析 MODBUS協議在不同的物理鏈路上的訊息幀有一些差異,

Linux程序間通訊(IPC)程式設計實踐(十)Posix訊息佇列--基本API的使用

posix訊息佇列與system v訊息佇列的差別: (1)對posix訊息佇列的讀總是返回最高優先順序的最早訊息,對system v訊息佇列的讀則可以返回任意指定優先順序的訊息。 (2)當往一個空佇列放置一個訊息時,posix訊息佇列允許產生一個訊號或啟動一個執行緒,

RabbitMQ初學安裝與常見問題記錄

安裝erl9.0 安裝rabbitmq server 環境變數 ERLANG_HOME,RABBITMQ_HOME,這兩個值為軟體的安裝目錄,Path裡新增兩個bin,成功後命令行輸入erl,如果出現Eshell V6.1類似字樣,說明成功

微信公眾號開發接收與傳送訊息

說明:該篇部落格是博主一字一碼編寫的,實屬不易,請尊重原創,謝謝大家! 在上一篇部落格中已經驗證了伺服器有效性:https://blog.csdn.net/qq_41782425/article/details/85321424 一丶概論 公眾號接收與傳送訊息 驗證

一步一步學linux程序間通訊——訊息佇列

一、什麼是訊息佇列:訊息佇列提供了一種程序與程序間傳送資料塊的一種方法,每個資料塊含有一個型別,接收程序可以獨立地接收含有不同型別的資料結構,可以通過傳送訊息來避免同步和阻塞問題。訊息佇列有最大長度限制       在分散式計算環境下,訊息佇列是為了對異構網路環境下的分散式應

#Python 初學編寫一個小遊戲#

#密碼輸入三次錯誤輸入限制 password_list = ['####','12345']

Linux程序通訊()IPC訊息佇列

訊息佇列提供了一種從一個程序向另一個程序傳送一個數據塊的方法。每個資料塊都被認為含有一個型別,接收程序可以獨立地接收含有不同型別的資料結構。我們可以通過傳送訊息來避免命名管道的同步和阻塞問題。但是訊息佇列與命名管道一樣,每個資料塊都有一個最大長度的限制。

RabbitMQ指南:工作隊列(Work Queues)

chan 需要 講解 nts rec 並行化 之一 RoCE edge 原文:RabbitMQ指南之二:工作隊列(Work Queues)   在上一章的指南中,我們寫了一個命名隊列:生產者往該命名隊列發送消息、消費從從該命名隊列中消費消息。在本章中,我們將創建一個工作隊

RabbitMQ訊息佇列:消費者和生產者 Demo

在使用RabbitMQ之前,需要了解RabbitMQ的工作原理。 RabbitMQ的工作原理 RabbitMQ是訊息代理。從本質上說,它接受來自生產者的資訊,並將它們傳遞給消費者。在兩者之間,它可以根據你給它的路由,緩衝規則進行傳遞訊息。 示例圖

訊息佇列RabbitMQ - 簡介和安裝

       訊息佇列:是簡單的生產者和消費者模式,它的出現是讓各個服務板塊之間解耦和訊息通知。比如,我們一般生成服務板塊中的資料存在有:資料庫,靜態檔案,搜尋系統,hdfs等,那麼如果資料庫中的資料發生了變化,怎麼把這個訊息推送給其他的資料儲存單元呢?如果單

RabbitMQ 訊息佇列 Exchange Types

寫在前面 RabbitMQ遵循AMQP 0-9-1協議 複製程式碼 AMQP 0-9-1協議簡介 訊息釋出到交換站,這通常被比作郵局或郵箱。然後交換器使用稱為繫結的規則將訊息副本分發到佇列。然後,AMQP代理將訊息傳遞給訂閱佇列的消費者,或者根據需要從佇列中獲取訊息。 釋出訊息時,釋出者可以指定各種