vs如何实现tcp连续发送多条消息_消息队列之 RabbitMQ
為什么要使用MQ消息中間件?它解決了什么問(wèn)題?關(guān)于為什么要使用消息中間件?消息中間件是如何做到同步變異步、流量削鋒、應(yīng)用解耦的?網(wǎng)上已經(jīng)有很多說(shuō)明,我這里就不再說(shuō)明。我在接下來(lái)的RabbitMq系列博客里會(huì)將官方的講解翻譯過(guò)來(lái),同時(shí)加以自己的理解整理成博客,希望能和大家共同交流,一起進(jìn)步。
RabbitMq原理圖
1、RabbitMq簡(jiǎn)介
RabbitMq是一個(gè)消息中間件:它接收消息、轉(zhuǎn)發(fā)消息。你可以把它理解為一個(gè)郵局:當(dāng)你向郵箱里寄出一封信后,郵遞員們就能最終將信送到收信人手中。類似的,RabbitMq就好比是一個(gè)郵箱、郵局和郵遞員。RabbitMq和郵局最大的區(qū)別是:RabbitMq接收、轉(zhuǎn)發(fā)的都是二進(jìn)制數(shù)據(jù)塊--消息,而不是紙質(zhì)的數(shù)據(jù)文件。
RabbitMq、消息相關(guān)術(shù)語(yǔ)如下:
生產(chǎn)者:生產(chǎn)者只發(fā)送消息,發(fā)送消息的程序即為生產(chǎn)者:
消息隊(duì)列:消息隊(duì)列就相當(dāng)于RabbitMq中的郵箱名稱。盡管消息在你的程序和RabbitMq中流動(dòng),但它只能存儲(chǔ)在消息隊(duì)列中。隊(duì)列本質(zhì)上是一個(gè)大的消息緩存,它能存多少消息,取決于主機(jī)的內(nèi)存和磁盤(pán)限制。多個(gè)生產(chǎn)者可以往同一個(gè)消息隊(duì)列中發(fā)送消息;多個(gè)消費(fèi)者可以從同一個(gè)隊(duì)列中獲取數(shù)據(jù)。我們以下列圖形來(lái)表示一個(gè)消息隊(duì)列:
消費(fèi)者:消費(fèi)者是一個(gè)等待接收消息的程序:
注意:生產(chǎn)者、消費(fèi)者和RabbitMq可以在不同的機(jī)器上;在很多的應(yīng)用中,一個(gè)生產(chǎn)者同時(shí)也可能是消費(fèi)者。
2、“Hello World!”
在這小節(jié)里,我們將寫(xiě)一個(gè)消息生產(chǎn)者用來(lái)發(fā)送消息、一個(gè)消息消費(fèi)者來(lái)消費(fèi)消息(接收消息并打印出來(lái))。
在下面圖形中,“P”是我們的生產(chǎn)者,“C”是我們的消費(fèi)者,中間的紅框是我們的消息隊(duì)列,保存了從生產(chǎn)者那里接收到的準(zhǔn)備轉(zhuǎn)發(fā)到消費(fèi)方的消息。
Java客戶端類庫(kù)說(shuō)明:
RabbitMq使用多種協(xié)議,本指南使用AMQP 0-9-1協(xié)議,該協(xié)議是一個(gè)開(kāi)源的、通用的消息協(xié)議。RabbitMq有多種語(yǔ)言的客戶端,這里我們使用JAVA語(yǔ)言的客戶端做實(shí)驗(yàn)。通過(guò)以下地址下載RabbitMq客戶端jar包和依賴包:
amqp-client-5.5.1.jar
slf4j-api-1.7.25.jar
slf4j-simple-1.7.25.jar
把這三個(gè)jar包拷貝到你的工作目錄,包括后面教程要新建的java文件。
2.1 發(fā)送消息
生產(chǎn)者連接RabbitMq,發(fā)送一條簡(jiǎn)單的消息”Hello World!“后就退出。
在Send.java類中,需要引入以下依賴包:
1 import com.rabbitmq.client.ConnectionFactory;2 import com.rabbitmq.client.Connection;3 import com.rabbitmq.client.Channel;復(fù)制代碼給隊(duì)列起個(gè)名字:
1 public class Send {2 private final static String QUEUE_NAME = "hello";3 public static void main(String[] argv) throws Exception {4 ...5 }6 }復(fù)制代碼創(chuàng)建連接到服務(wù)器的連接Collection:
1 onnectionFactory factory = new ConnectionFactory();2 factory.setHost("localhost");3 try (Connection connection = factory.newConnection();4 Channel channel = connection.createChannel()) {5 6 }復(fù)制代碼這個(gè)連接即套接字連接,為我們處理協(xié)議版本協(xié)商和身份驗(yàn)證等。這里我們連接一個(gè)本地的RabbitMq:因此是localhost,如果你想要連接一個(gè)遠(yuǎn)程機(jī)器上的RabbitMq,只需要把localhst改成那臺(tái)機(jī)器的計(jì)算機(jī)名或是IP地址。
創(chuàng)建完連接之后,我們繼續(xù)創(chuàng)建一個(gè)信道:Channel。我們需要使用try-with-resource表達(dá)式,因?yàn)镃onnection和Channel都實(shí)現(xiàn)了JAVA接口Closeable,屬于資源,需要關(guān)閉,這樣我們就不需要顯示地在我們的代碼中進(jìn)行關(guān)閉了。(關(guān)于信道,請(qǐng)參考文章最頂部的RabbitMq原理圖,是TCP里面的虛擬鏈接,例如:電纜相當(dāng)于一個(gè)TCP,信道就是里面的一個(gè)獨(dú)立光纖,一條TCP上面創(chuàng)建多條信道是沒(méi)有問(wèn)題的;TCP一旦打開(kāi)就分創(chuàng)建AMQP信道;無(wú)論是發(fā)布消息、接收消息、訂閱隊(duì)列,這些動(dòng)作都是通過(guò)信道完成的)。
為了發(fā)送消息,我們還必須要定義一個(gè)需要發(fā)送到的消息隊(duì)列,這些都要使用try-with-resource表達(dá)式:
1 channel.queueDeclare(QUEUE_NAME, false, false, false, null);2 String message = "Hello World!";3 channel.basicPublish( 《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的vs如何实现tcp连续发送多条消息_消息队列之 RabbitMQ的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: MySQL自动备份到本地数据库_MYSQ
- 下一篇: java 抛出403_java.io.I