Docker 的優點
772
2025-04-01
聲明:本系列文章是根據b站狂神課進行 學習記錄。原b站鏈接:https://www.bilibili.com/video/BV1dX4y1V73G?p=12,侵權刪。
rabbitmq是spring一個公司的,所以很多公司 企業選擇用rabbitmq。
所有的中間件技術都是基于TCP、IP的協議,只不過rabbitmq遵循的是amqp,在tcp、ip基礎之上定義的。
五個用的比較多的模式。現在來實現一個簡單的步驟。
這就是最簡單的模式。一個生產者一個消費者,一個MQ。
因為是基于tcp和ip的。所以一定會有ip和端口。
具體步驟:
1、創建連接工程。
2、創建連接Connection
3、通過連接獲取通道Channel。
4、通過通道創建交換機、聲明隊列、綁定關系、路由Key、發送消息、接收消息。
5、準備消息內容。
6、發送消息給消息隊列queue。
7、關閉連接。
8、關閉通道。
1、構建一個maven工程
2、導入rabbitmq的maven依賴
java的原聲依賴
spring的依賴
springboot依賴
rabbitmq和spring同屬一個公司開放的產品,所以他們的支持也是非常完善,這也是為什么推薦使用rabbitmq的一個原因
3、啟動rabbitmq-server服務
systemctl start rabbitmq-server 或者 docker start myrabbit
4、定義生產者
package com.xuexiangban.rabbitmq.simple; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; /** * @author: 學相伴-飛哥 * @description: Producer 簡單隊列生產者 * @Date : 2021/3/2 */ public class Producer { public static void main(String[] args) { // 1: 創建連接工廠 ConnectionFactory connectionFactory = new ConnectionFactory(); // 2: 設置連接屬性 connectionFactory.setHost("47.104.141.27"); connectionFactory.setPort(5672); connectionFactory.setVirtualHost("/"); connectionFactory.setUsername("admin"); connectionFactory.setPassword("admin"); Connection connection = null; Channel channel = null; try { // 3: 從連接工廠中獲取連接 connection = connectionFactory.newConnection("生產者"); // 4: 從連接中獲取通道channel channel = connection.createChannel(); // 5: 申明隊列queue存儲消息 /* * 如果隊列不存在,則會創建 * Rabbitmq不允許創建兩個相同的隊列名稱,否則會報錯。 * * @params1: queue 隊列的名稱 * @params2: durable 隊列是否持久化 * @params3: exclusive 是否排他,即是否私有的,如果為true,會對當前隊列加鎖,其他的通道不能訪問,并且連接自動關閉 * @params4: autoDelete 是否自動刪除,當最后一個消費者斷開連接之后是否自動刪除消息。 * @params5: arguments 可以設置隊列附加參數,設置隊列的有效期,消息的最大長度,隊列的消息生命周期等等。 * */ channel.queueDeclare("queue1", false, false, false, null); // 6: 準備發送消息的內容 String message = "你好,學相伴!!!"; // 7: 發送消息給中間件rabbitmq-server // @params1: 交換機exchange // @params2: 隊列名稱/routing // @params3: 屬性配置 // @params4: 發送消息的內容 channel.basicPublish("", "queue1", null, message.getBytes()); System.out.println("消息發送成功!"); } catch (Exception ex) { ex.printStackTrace(); System.out.println("發送消息出現異常..."); } finally { // 7: 釋放連接關閉通道 if (channel != null && channel.isOpen()) { try { channel.close(); } catch (Exception ex) { ex.printStackTrace(); } } if (connection != null) { try { connection.close(); } catch (Exception ex) { ex.printStackTrace(); } } } } }
5、web端觀察運行結果
先有了鏈接、然后有了通道、然后慢慢就有了。
(配合java打斷點一步一步 進行查看)
在我們設置代碼的時候,設置的是非持久化,所以隨著最后一個消息完畢后,是否把消息隊列刪除。
6、消費者代碼
package com.xuexiangban.rabbitmq.simple; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; /** * @author: 學相伴-飛哥 * @description: Producer 簡單隊列生產者 * @Date : 2021/3/2 */ public class Producer { public static void main(String[] args) { // 1: 創建連接工廠 ConnectionFactory connectionFactory = new ConnectionFactory(); // 2: 設置連接屬性 connectionFactory.setHost("47.104.141.27"); connectionFactory.setPort(5672); connectionFactory.setVirtualHost("/"); connectionFactory.setUsername("admin"); connectionFactory.setPassword("admin"); Connection connection = null; Channel channel = null; try { // 3: 從連接工廠中獲取連接 connection = connectionFactory.newConnection("生產者"); // 4: 從連接中獲取通道channel channel = connection.createChannel(); // 5: 申明隊列queue存儲消息 /* * 如果隊列不存在,則會創建 * Rabbitmq不允許創建兩個相同的隊列名稱,否則會報錯。 * * @params1: queue 隊列的名稱 * @params2: durable 隊列是否持久化 * @params3: exclusive 是否排他,即是否私有的,如果為true,會對當前隊列加鎖,其他的通道不能訪問,并且連接自動關閉 * @params4: autoDelete 是否自動刪除,當最后一個消費者斷開連接之后是否自動刪除消息。 * @params5: arguments 可以設置隊列附加參數,設置隊列的有效期,消息的最大長度,隊列的消息生命周期等等。 * */ channel.queueDeclare("queue1", false, false, false, null); // 6: 準備發送消息的內容 String message = "你好,學相伴!!!"; // 7: 發送消息給中間件rabbitmq-server // @params1: 交換機exchange // @params2: 隊列名稱/routing // @params3: 屬性配置 // @params4: 發送消息的內容 channel.basicPublish("", "queue1", null, message.getBytes()); System.out.println("消息發送成功!"); } catch (Exception ex) { ex.printStackTrace(); System.out.println("發送消息出現異常..."); } finally { // 7: 釋放連接關閉通道 if (channel != null && channel.isOpen()) { try { channel.close(); } catch (Exception ex) { ex.printStackTrace(); } } if (connection != null) { try { connection.close(); } catch (Exception ex) { ex.printStackTrace(); } } } } }
持久化和非持久化就是:服務器重啟隊列是否還在,持久化肯定在,同時需要注意持久化肯定會存盤。但是非持久化會 存盤,但是隨著服務器的重啟會丟失的。
RabbitMQ
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。