国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java RabbitMQ消息隊(duì)列簡單使用

這篇具有很好參考價(jià)值的文章主要介紹了Java RabbitMQ消息隊(duì)列簡單使用。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一、消息隊(duì)列

什么是消息隊(duì)列

消息隊(duì)列,即MQ,Message Queue。

java rabbitmq發(fā)送消息,Java,中間件,java-rabbitmq,rabbitmq,java

消息隊(duì)列是典型的:生產(chǎn)者、消費(fèi)者模型。生產(chǎn)者不斷向消息隊(duì)列中生產(chǎn)消息,消費(fèi)者不斷的從隊(duì)列中獲取消息。因?yàn)橄⒌纳a(chǎn)和消費(fèi)都是異步的,而且只關(guān)心消息的發(fā)送和接收,沒有業(yè)務(wù)邏輯的侵入,這樣就實(shí)現(xiàn)了生產(chǎn)者和消費(fèi)者的解耦。

二、RabbitMQ

RabbitMQ是基于AMQP的一款消息管理系統(tǒng)。

支持主流的操作系統(tǒng),Linux、Windows、MacOX等。

支持多種開發(fā)語言,Java、Python、Ruby、.NET、PHP、C/C++、node.js等。

官網(wǎng):?Messaging that just works — RabbitMQ

官方教程:RabbitMQ Tutorials — RabbitMQ

RabbitMQ 基本概念

java rabbitmq發(fā)送消息,Java,中間件,java-rabbitmq,rabbitmq,java

Message
消息,消息是不具名的,它由消息頭和消息體組成。消息體是不透明的,而消息頭則由一系列的可選屬性組成,這些屬性包括routing-key(路由鍵)、priority(相對于其他消息的優(yōu)先權(quán))、delivery-mode(指出該消息可能需要持久性存儲(chǔ))等。

Publisher
消息的生產(chǎn)者,也是一個(gè)向交換器發(fā)布消息的客戶端應(yīng)用程序。

Exchange
交換器,用來接收生產(chǎn)者發(fā)送的消息并將這些消息路由給服務(wù)器中的隊(duì)列。

Binding
綁定,用于消息隊(duì)列和交換器之間的關(guān)聯(lián)。一個(gè)綁定就是基于路由鍵將交換器和消息隊(duì)列連接起來的路由規(guī)則,所以可以將交換器理解成一個(gè)由綁定構(gòu)成的路由表。

Queue
消息隊(duì)列,用來保存消息直到發(fā)送給消費(fèi)者。它是消息的容器,也是消息的終點(diǎn)。一個(gè)消息可投入一個(gè)或多個(gè)隊(duì)列。消息一直在隊(duì)列里面,等待消費(fèi)者連接到這個(gè)隊(duì)列將其取走。

Connection
網(wǎng)絡(luò)連接,比如一個(gè)TCP連接。無論生產(chǎn)者還是消費(fèi)者,都需要與RabbitMQ建立連接后才可以完成消息的生產(chǎn)和消費(fèi)。

Channel
信道,多路復(fù)用連接中的一條獨(dú)立的雙向數(shù)據(jù)流通道。信道是建立在真實(shí)的TCP連接內(nèi)地虛擬連接,AMQP 命令都是通過信道發(fā)出去的,不管是發(fā)布消息、訂閱隊(duì)列還是接收消息,這些動(dòng)作都是通過信道完成。因?yàn)閷τ诓僮飨到y(tǒng)來說建立和銷毀 TCP 都是非常昂貴的開銷,所以引入了信道的概念,以復(fù)用一條 TCP 連接。

Consumer
消息的消費(fèi)者,表示一個(gè)從消息隊(duì)列中取得消息的客戶端應(yīng)用程序。

Virtual Host
虛擬主機(jī),表示一批交換器、消息隊(duì)列和相關(guān)對象。虛擬主機(jī)是共享相同的身份認(rèn)證和加密環(huán)境的獨(dú)立服務(wù)器域。每個(gè) vhost 本質(zhì)上就是一個(gè) mini 版的 RabbitMQ 服務(wù)器,擁有自己的隊(duì)列、交換器、綁定和權(quán)限機(jī)制。vhost 是 AMQP 概念的基礎(chǔ),必須在連接時(shí)指定,RabbitMQ 默認(rèn)的 vhost 是 / 。

Broker
表示消息隊(duì)列服務(wù)器實(shí)體。

?三、簡單消息模型使用

RabbitMQ是一個(gè)消息代理:它接受和轉(zhuǎn)發(fā)消息。 你可以把它想象成一個(gè)郵局:當(dāng)你把郵件放在郵箱里時(shí),你可以確定郵差先生最終會(huì)把郵件發(fā)送給你的收件人。 在這個(gè)比喻中,RabbitMQ是郵政信箱,郵局和郵遞員。

RabbitMQ與郵局的主要區(qū)別是它不處理紙張,而是接受,存儲(chǔ)和轉(zhuǎn)發(fā)數(shù)據(jù)消息的二進(jìn)制數(shù)據(jù)塊。

java rabbitmq發(fā)送消息,Java,中間件,java-rabbitmq,rabbitmq,java

P(producer/ publisher):生產(chǎn)者,一個(gè)發(fā)送消息的用戶應(yīng)用程序。

C(consumer):消費(fèi)者,消費(fèi)和接收有類似的意思,消費(fèi)者是一個(gè)主要用來等待接收消息的用戶應(yīng)用程序

隊(duì)列(紅色區(qū)域):rabbitmq內(nèi)部類似于郵箱的一個(gè)概念。雖然消息流經(jīng)rabbitmq和你的應(yīng)用程序,但是它們只能存儲(chǔ)在隊(duì)列中。隊(duì)列只受主機(jī)的內(nèi)存和磁盤限制,實(shí)質(zhì)上是一個(gè)大的消息緩沖區(qū)。許多生產(chǎn)者可以發(fā)送消息到一個(gè)隊(duì)列,許多消費(fèi)者可以嘗試從一個(gè)隊(duì)列接收數(shù)據(jù)。

總之:生產(chǎn)者將消息發(fā)送到隊(duì)列,消費(fèi)者從隊(duì)列中獲取消息,隊(duì)列是存儲(chǔ)消息的緩沖區(qū)。

代碼演示

引入依賴

 <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-amqp</artifactId>
       <version>2.0.6.RELEASE</version>
</dependency>

?獲取連接

package com.util;

import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

public class ConnectionUtil {
    /**
     * 建立與RabbitMQ的連接
     * @return
     * @throws Exception
     */
    public static Connection getConnection() throws Exception {
        //定義連接工廠
        ConnectionFactory factory = new ConnectionFactory();
        //設(shè)置服務(wù)地址
        factory.setHost("192.168.33.88");
        //TCP端口
        factory.setPort(5672);
        //設(shè)置賬號信息,用戶名、密碼、vhost
        factory.setVirtualHost("vhost_NetDataGather");
        factory.setUsername("admin");
        factory.setPassword("123456");
        // 通過工程獲取連接
        Connection connection = factory.newConnection();
        return connection;
    }
}

生產(chǎn)者

import com.util.ConnectionUtil;
 
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
/**
 * 生產(chǎn)者
 */
public class Send {
     //聲明隊(duì)列名稱
    private final static String QUEUE_NAME = "simple_queue";
 
    public static void main(String[] argv) throws Exception {
        // 生產(chǎn)者和Broker建立TCP連接。
        Connection connection = ConnectionUtil.getConnection();
        // 生產(chǎn)者和Broker建立通道。
        Channel channel = connection.createChannel();
        // 聲明(創(chuàng)建)隊(duì)列
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        // 消息內(nèi)容
        String message = "Hello World!";
        for (int i = 0; i < 10; i++) {
            // 向指定的隊(duì)列中發(fā)送消息
            message=message+i;
            channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
        }
        //關(guān)閉通道和連接
        channel.close();
        connection.close();
    }
}

消費(fèi)者

import java.io.IOException;
 
import com.rabbitmq.client.AMQP.BasicProperties;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
 
import com.util.ConnectionUtil;
 
/**
 * 消費(fèi)者
 */
public class Recv {
    private final static String QUEUE_NAME = "simple_queue";
 
    public static void main(String[] argv) throws Exception {
        // 獲取到連接
        Connection connection = ConnectionUtil.getConnection();
        // 創(chuàng)建通道
        Channel channel = connection.createChannel();
        // 聲明隊(duì)列
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        // 定義隊(duì)列的消費(fèi)者
        DefaultConsumer consumer = new DefaultConsumer(channel) {
            // 獲取消息,并且處理,這個(gè)方法類似事件監(jiān)聽,如果有消息的時(shí)候,會(huì)被自動(dòng)調(diào)用
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties,
                    byte[] body) throws IOException {
                // body 即消息體
                String msg = new String(body);
            }
        };
        // 監(jiān)聽隊(duì)列,第二個(gè)參數(shù):是否自動(dòng)進(jìn)行消息確認(rèn)。
        channel.basicConsume(QUEUE_NAME, true, consumer);
    }
}

上述代碼中:消息一旦被消費(fèi)者接收,隊(duì)列中的消息就會(huì)被刪除。

如果消費(fèi)者領(lǐng)取消息后,還沒執(zhí)行操作就掛掉了呢?或者拋出了異常?消息消費(fèi)失敗,但是RabbitMQ無從得知,這樣消息就丟失了!

因此,RabbitMQ有一個(gè)ACK機(jī)制。當(dāng)消費(fèi)者獲取消息后,會(huì)向RabbitMQ發(fā)送回執(zhí)ACK,告知消息已經(jīng)被接收。不過這種回執(zhí)ACK分兩種情況:

自動(dòng)ACK:消息一旦被接收,消費(fèi)者自動(dòng)發(fā)送ACK。

手動(dòng)ACK:消息接收后,不會(huì)發(fā)送ACK,需要手動(dòng)調(diào)用。

手動(dòng)ACK

import java.io.IOException;
 
import com.rabbitmq.client.AMQP.BasicProperties;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
 
import com.util.ConnectionUtil;
 
/**
 * 消費(fèi)者,手動(dòng)進(jìn)行ACK
 */
public class Recv2 {
    private final static String QUEUE_NAME = "simple_queue";
 
    public static void main(String[] argv) throws Exception {
        // 獲取到連接
        Connection connection = ConnectionUtil.getConnection();
        // 創(chuàng)建通道
        final Channel channel = connection.createChannel();
        // 聲明隊(duì)列
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        // 定義隊(duì)列的消費(fèi)者
        DefaultConsumer consumer = new DefaultConsumer(channel) {
            // 獲取消息,并且處理,這個(gè)方法類似事件監(jiān)聽,如果有消息的時(shí)候,會(huì)被自動(dòng)調(diào)用
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties,
                    byte[] body) throws IOException {
                // body 即消息體
                String msg = new String(body);
                // 手動(dòng)進(jìn)行ACK
                channel.basicAck(envelope.getDeliveryTag(), false);
            }
        };
        // 監(jiān)聽隊(duì)列,第二個(gè)參數(shù)false,手動(dòng)進(jìn)行ACK
        // 如果第二個(gè)參數(shù)為true,則會(huì)自動(dòng)進(jìn)行ACK;如果為false,則需要手動(dòng)ACK。方法的聲明:
        channel.basicConsume(QUEUE_NAME, false, consumer);
    }
}

以上就是RabbitMQ的簡單使用講解,更多詳細(xì)使用內(nèi)容,請?jiān)俣喽鄬W(xué)習(xí)。文章來源地址http://www.zghlxwxcb.cn/news/detail-659799.html

到了這里,關(guān)于Java RabbitMQ消息隊(duì)列簡單使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • TP5簡單使用RabbitMQ實(shí)現(xiàn)消息隊(duì)列

    在使用 RabbitMQ 之前,你要安裝好 RabbitMQ 服務(wù),具體安裝方法可以參考 windows下安裝RabbitMQ 1、安裝擴(kuò)展 進(jìn)入TP5 更目錄下,輸入命令安裝: composer require php-amqplib/php-amqplib 2、自定義命令 TP5 的自定義命令,這里也簡單說下。 第一步: 創(chuàng)建命令類文件,新建 application/api/command

    2024年02月07日
    瀏覽(28)
  • RabbitMQ可靠性消息發(fā)送(java實(shí)現(xiàn))

    RabbitMQ可靠性消息發(fā)送(java實(shí)現(xiàn))

    本博客屬于 《RabbitMQ基礎(chǔ)組件封裝—整體結(jié)構(gòu)》的子博客 step1:消息落庫,業(yè)務(wù)數(shù)據(jù)存庫的同時(shí),也要將消息記錄存入數(shù)據(jù)庫,二者要保證原子性; step2:Producer發(fā)送消息到MQ Broker; step3:Producer收到 broker 返回的確認(rèn)消息; step4:更改消息記錄庫的狀態(tài)(定義三種狀態(tài):0待確

    2024年02月04日
    瀏覽(24)
  • Java開發(fā) - 消息隊(duì)列之RabbitMQ初體驗(yàn)

    Java開發(fā) - 消息隊(duì)列之RabbitMQ初體驗(yàn)

    目錄 前言 RabbitMQ 什么是RabbitMQ RabbitMQ特點(diǎn) 安裝啟動(dòng) RabbitMQ和Kafka的消息收發(fā)區(qū)別 RabbitMQ使用案例 添加依賴 添加配置 創(chuàng)建RabbitMQ配置類 RabbitMQ消息的發(fā)送 RabbitMQ消息的接收 測試 結(jié)語 前一篇,我們學(xué)習(xí)了Kafka的基本使用,這一篇,我們來學(xué)習(xí)RabbitMQ。他們作為消息隊(duì)列本身都具

    2024年02月03日
    瀏覽(21)
  • 【Java】微服務(wù)——RabbitMQ消息隊(duì)列(SpringAMQP實(shí)現(xiàn)五種消息模型)

    【Java】微服務(wù)——RabbitMQ消息隊(duì)列(SpringAMQP實(shí)現(xiàn)五種消息模型)

    微服務(wù)間通訊有同步和異步兩種方式: 同步通訊:就像打電話,需要實(shí)時(shí)響應(yīng)。 異步通訊:就像發(fā)郵件,不需要馬上回復(fù)。 兩種方式各有優(yōu)劣,打電話可以立即得到響應(yīng),但是你卻不能跟多個(gè)人同時(shí)通話。發(fā)送郵件可以同時(shí)與多個(gè)人收發(fā)郵件,但是往往響應(yīng)會(huì)有延遲。 1.

    2024年02月08日
    瀏覽(18)
  • RabbitMQ實(shí)現(xiàn)延遲消息,RabbitMQ使用死信隊(duì)列實(shí)現(xiàn)延遲消息,RabbitMQ延時(shí)隊(duì)列插件

    RabbitMQ實(shí)現(xiàn)延遲消息,RabbitMQ使用死信隊(duì)列實(shí)現(xiàn)延遲消息,RabbitMQ延時(shí)隊(duì)列插件

    假設(shè)有一個(gè)業(yè)務(wù)場景:超過30分鐘未付款的訂單自動(dòng)關(guān)閉,這個(gè)功能應(yīng)該怎么實(shí)現(xiàn)? RabbitMQ使用死信隊(duì)列,可以實(shí)現(xiàn)消息的延遲接收。 隊(duì)列有一個(gè)消息過期屬性。就像豐巢超過24小時(shí)就收費(fèi)一樣,通過設(shè)置這個(gè)屬性,超過了指定事件的消息將會(huì)被丟棄。 這個(gè)屬性交:x-message

    2024年02月13日
    瀏覽(104)
  • 消息隊(duì)列——RabbitMQ基本概念+容器化部署和簡單工作模式程序

    消息隊(duì)列——RabbitMQ基本概念+容器化部署和簡單工作模式程序

    目錄 基本概念? MQ 的優(yōu)勢 ?1.應(yīng)用解耦 ?2.異步提速 ?3.削峰填谷 ?MQ 的劣勢 使用mq的條件 ?常見MQ產(chǎn)品 ?RabbitMQ簡介 RabbitMQ的六種工作模式? ?JMS RabbitMQ安裝和配置。 RabbitMQ控制臺(tái)使用。 RabbitMQ快速入門——生產(chǎn)者 需求: RabbitMQ快速入門——消費(fèi)者 小結(jié)? 多個(gè)系統(tǒng)之間的通信方

    2024年02月16日
    瀏覽(26)
  • RabbitMQ的消費(fèi)者處理消息失敗后可以重試,重試4次仍然失敗發(fā)送到死信隊(duì)列。

    RabbitMQ的消費(fèi)者處理消息失敗后可以重試,重試4次仍然失敗發(fā)送到死信隊(duì)列。

    生產(chǎn)者發(fā)送消息時(shí)采用雪花算法給消息設(shè)置唯一的消息id,消費(fèi)者接收消息處理失敗時(shí),根據(jù)消息的唯一id統(tǒng)計(jì)失敗次數(shù),若沒有達(dá)到失敗次數(shù)限制,則讓消息重回隊(duì)列(在開啟手動(dòng)簽收的前提),此時(shí)隊(duì)列會(huì)再次給消費(fèi)者發(fā)送消息;若達(dá)到失敗次數(shù)限制,則讓消息不重回隊(duì)列,

    2024年02月07日
    瀏覽(92)
  • RabbitMQ系列(5)--使用Java實(shí)現(xiàn)RabbitMQ的消費(fèi)者接收消息

    RabbitMQ系列(5)--使用Java實(shí)現(xiàn)RabbitMQ的消費(fèi)者接收消息

    前言:先簡單了解RabbitMQ的工作過程,方便后續(xù)開發(fā)理清思路 簡略: 詳細(xì): 1、新建消費(fèi)者類 效果圖: 2、編寫消費(fèi)者消費(fèi)消息的代碼 例: 3、查看代碼運(yùn)行結(jié)果 運(yùn)行代碼后如果有輸出生產(chǎn)者發(fā)送的”Hello World”信息,則證明消費(fèi)者消費(fèi)消息成功 4、在web頁面上查看隊(duì)列的消

    2024年02月06日
    瀏覽(19)
  • 【RabbitMQ】RabbitMQ 消息的堆積問題 —— 使用惰性隊(duì)列解決消息的堆積問題

    【RabbitMQ】RabbitMQ 消息的堆積問題 —— 使用惰性隊(duì)列解決消息的堆積問題

    消息的堆積問題是指在消息隊(duì)列系統(tǒng)中,當(dāng)生產(chǎn)者以較快的速度發(fā)送消息,而消費(fèi)者處理消息的速度較慢,導(dǎo)致消息在隊(duì)列中積累并達(dá)到隊(duì)列的存儲(chǔ)上限。在這種情況下,最早被發(fā)送的消息可能會(huì)在隊(duì)列中滯留較長時(shí)間,直到超過隊(duì)列的容量上限。當(dāng)隊(duì)列已滿且沒有更多的可

    2024年02月05日
    瀏覽(19)
  • RabbitMQ 消息隊(duì)列使用

    RabbitMQ 消息隊(duì)列使用

    同步調(diào)用優(yōu)點(diǎn): 時(shí)效性強(qiáng),立即得到結(jié)果 缺點(diǎn): 耦合度高 新業(yè)務(wù)新需求到來時(shí),需要修改代碼 性能和吞吐能力下降 調(diào)用服務(wù)的響應(yīng)時(shí)間為所有服務(wù)的時(shí)間之和 資源浪費(fèi) 調(diào)用鏈中的服務(wù)在等待時(shí)不會(huì)釋放請求占用的資源 級聯(lián)失敗 一個(gè)服務(wù)執(zhí)行失敗會(huì)導(dǎo)致調(diào)用鏈后續(xù)所有服務(wù)失

    2024年01月21日
    瀏覽(15)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包