RabbitMQ基础介绍
目錄
rabbitmq
術(shù)語(yǔ)
代碼
概念
rabbitmq
術(shù)語(yǔ)
RabbitMQ: 實(shí)現(xiàn)了消息隊(duì)列協(xié)議(AMQP)的開(kāi)源消息代理軟件及面向消息的中間件。RabbitMQ服務(wù)器是用Erlang語(yǔ)言編寫(xiě)的。
AMQP :一個(gè)提供統(tǒng)一消息服務(wù)的應(yīng)用層標(biāo)準(zhǔn)高級(jí)消息隊(duì)列協(xié)議,是應(yīng)用層協(xié)議的一個(gè)開(kāi)放標(biāo)準(zhǔn),為面向消息的中間件設(shè)計(jì)。消息中間件主要用于組件之間的解耦,消息的發(fā)送者無(wú)需知道消息使用者的存在,反之亦然。
生產(chǎn)者:投遞消息的一方,生產(chǎn)者創(chuàng)建消息,然后發(fā)布到rabbitmq中。
消費(fèi)者,就是接收消息的 一方。消費(fèi)者連接到 RabbitMQ 服務(wù)器,并訂閱到隊(duì)列上 。 消費(fèi)者也不需要知道誰(shuí)是生產(chǎn)者 。
隊(duì)列:隊(duì)列就像一個(gè)超市或者流水線,在RabbitMQ中,生產(chǎn)者創(chuàng)建消息,來(lái)到RabbitMQ的隊(duì)列,消費(fèi)者可以從隊(duì)列中取出消息進(jìn)行消費(fèi)。所有信息可以只存儲(chǔ)在一個(gè)隊(duì)列中。隊(duì)列可以存儲(chǔ)很多的消息,因?yàn)樗旧鲜且粋€(gè)無(wú)限制的緩沖區(qū),前提是你的機(jī)器有足夠的存儲(chǔ)空間。多個(gè)生產(chǎn)者可以將消息發(fā)送到同一個(gè)隊(duì)列中,多個(gè)消費(fèi)者也可以只從同一個(gè)隊(duì)列接收數(shù)據(jù)。這就是隊(duì)列的特性。
代碼
使用工具是eclipse,創(chuàng)建maven項(xiàng)目 ,可以引入依賴
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?<dependency>
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <groupId>com.rabbitmq</groupId>
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <artifactId>amqp-client</artifactId>
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?<version>3.6.0</version>
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? </dependency>
demo目錄
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
生產(chǎn)者:
package com.ll.mq.hellomq;import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory;/*** * @author ll 生產(chǎn)者**/ public class Producer {public final static String QUENE_NAME = "hello";// 定義隊(duì)列名稱public static void main(String[] args) {try {// 創(chuàng)建連接工廠ConnectionFactory factory = new ConnectionFactory();// RabbitMQ地址factory.setHost("127.0.0.1");factory.setPort(5672);factory.setUsername("kysc");factory.setPassword("123456");// 創(chuàng)建一個(gè)連接Connection connection = factory.newConnection();// 創(chuàng)建一個(gè)頻道Channel channel = connection.createChannel();// 聲明一個(gè)隊(duì)列 在RabbitMQ中,隊(duì)列聲明是冪等性的(一個(gè)冪等操作的特點(diǎn)是其任意多次執(zhí)行所產(chǎn)生的影響均與一次執(zhí)行的影響相同),也就是說(shuō),如果不存在,就創(chuàng)建,如果存在,不會(huì)對(duì)已經(jīng)存在的隊(duì)列產(chǎn)生任何影響。channel.queueDeclare(QUENE_NAME, false, false, false, null);String message = "HELLO MQ!";// 發(fā)送消息到隊(duì)列中channel.basicPublish("", QUENE_NAME, null, message.getBytes("UTF-8"));System.out.println("Producer [x] Send '" + message + "'");// 關(guān)閉頻道和連接channel.close();connection.close();} catch (Exception e) {e.printStackTrace();} }}消費(fèi)者
package com.ll.mq.hellomq;import java.io.IOException;import com.rabbitmq.client.AMQP; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; import com.rabbitmq.client.DefaultConsumer; import com.rabbitmq.client.Envelope; /*** * @author ll Consumer **/ public class Consumer {private final static String QUEUE_NAME = "hello";public static void main(String[] argv) throws Exception {// 創(chuàng)建連接工廠ConnectionFactory factory = new ConnectionFactory(); // 設(shè)置RabbitMQ地址factory.setHost("127.0.0.1");factory.setPort(5672);factory.setUsername("kysc");factory.setPassword("123456"); // 創(chuàng)建一個(gè)連接Connection connection = factory.newConnection(); // 創(chuàng)建一個(gè)頻道Channel channel = connection.createChannel(); // 聲明要關(guān)注的隊(duì)列 -- 在RabbitMQ中,隊(duì)列聲明是冪等性的(一個(gè)冪等操作的特點(diǎn)是其任意多次執(zhí)行所產(chǎn)生的影響均與一次執(zhí)行的影響相同),也就是說(shuō),如果不存在,就創(chuàng)建,如果存在,不會(huì)對(duì)已經(jīng)存在的隊(duì)列產(chǎn)生任何影響。channel.queueDeclare(QUEUE_NAME, false, false, false, null);System.out.println("C [*] Waiting for messages. To exit press CTRL+C"); // DefaultConsumer類(lèi)實(shí)現(xiàn)了Consumer接口,通過(guò)傳入一個(gè)頻道,告訴服務(wù)器我們需要那個(gè)頻道的消息,如果頻道中有消息,就會(huì)執(zhí)行回調(diào)函數(shù)handleDeliveryDefaultConsumer consumer = new DefaultConsumer(channel) {@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {String message = new String(body, "UTF-8");System.out.println("C [x] Received '" + message + "'");}}; // 自動(dòng)回復(fù)隊(duì)列應(yīng)答 -- RabbitMQ中的消息確認(rèn)機(jī)制,后面章節(jié)會(huì)詳細(xì)講解channel.basicConsume(QUEUE_NAME, true, consumer);} }接受結(jié)果:C [*] Waiting for messages. To exit press CTRL+C
? ? ? ? ? ? ? ? ? C [x] Received 'HELLO MQ!'
概念
ConnectionFactory(連接工廠): 生產(chǎn)Connection的的工廠
Connection(連接):是RabbitMQ的socket的長(zhǎng)鏈接,它封裝了socket協(xié)議相關(guān)部分邏輯
Channel(頻道|信道): 是建立在Connection連接之上的一種輕量級(jí)的連接,我們大部分的業(yè)務(wù)操作是在Channel這個(gè)接口中完成的,包括定義隊(duì)列的聲明queueDeclare、交換機(jī)的聲明exchangeDeclare、隊(duì)列的綁定queueBind、發(fā)布消息basicPublish、消費(fèi)消息basicConsume等。
public Queue.DeclareOk queueDeclare(String queue, boolean durable, boolean exclusive,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? boolean autoDelete, Map<String, Object> arguments)
queue: 隊(duì)列名稱
durable: 是否持久化, 隊(duì)列的聲明默認(rèn)是存放到內(nèi)存中的,如果rabbitmq重啟會(huì)丟失,如果想重啟之后還存在就要使隊(duì)列持久化,保存到Erlang自帶的Mnesia數(shù)據(jù)庫(kù)中,當(dāng)rabbitmq重啟之后會(huì)讀取該數(shù)據(jù)庫(kù)
exclusive:是否排外
1 當(dāng)exclusive = true則設(shè)置隊(duì)列為排他的。如果一個(gè)隊(duì)列被聲明為排他隊(duì)列,該隊(duì)列 僅對(duì)首次聲明它的連接(Connection)可見(jiàn),是該Connection私有的,類(lèi)似于加鎖,并在連接斷開(kāi)connection.close()時(shí)自動(dòng)刪除 ;
2 exclusive = false則設(shè)置隊(duì)列為非排他的,此時(shí)不同連接(Connection)的管道Channel可以使用該隊(duì)列 ;
"首次" 是指如果某個(gè)連接(Connection)已經(jīng)聲明了排他隊(duì)列,其他連接是不允許建立同名的排他隊(duì)列的。這個(gè)與普通隊(duì)列不同:即使該隊(duì)列是持久化的(durable = true),一旦連接關(guān)閉或者客戶端退出,該排他隊(duì)列都會(huì)被自動(dòng)刪除,這種隊(duì)列適用于一個(gè)客戶端同時(shí)發(fā)送和讀取消息的應(yīng)用場(chǎng)景。
4. autoDelete: 是否自動(dòng)刪除 ;如果autoDelete = true,當(dāng)所有消費(fèi)者都與這個(gè)隊(duì)列斷開(kāi)連接時(shí),這個(gè)隊(duì)列會(huì)自動(dòng)刪除。注意: 不是說(shuō)該隊(duì)列沒(méi)有消費(fèi)者連接時(shí)該隊(duì)列就會(huì)自動(dòng)刪除,因?yàn)楫?dāng)生產(chǎn)者聲明了該隊(duì)列且沒(méi)有消費(fèi)者連接消費(fèi)時(shí),該隊(duì)列是不會(huì)自動(dòng)刪除的。
5. arguments: 設(shè)置隊(duì)列的其他一些參數(shù),如 x-rnessage-ttl 、x-expires 、x-rnax-length 、x-rnax-length-bytes、 x-dead-letter-exchange、 x-deadletter-routing-key 、 x-rnax-priority 。
參考:https://blog.csdn.net/AwayFuture/article/details/103405335?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
下一篇https://blog.csdn.net/lilongwangyamin/article/details/105098011?rabbitmq 隊(duì)列
整體代碼:https://download.csdn.net/download/lilongwangyamin/12272687
總結(jié)
以上是生活随笔為你收集整理的RabbitMQ基础介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: spcomm控件的使用
- 下一篇: Brush.style:=bsClear