最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springboot rabbitmq整合rabbitmq之消息持久化存儲(chǔ)問題

 更新時(shí)間:2023年09月28日 08:50:08   作者:weixin_43831204  
這篇文章主要介紹了springboot rabbitmq整合rabbitmq之消息持久化存儲(chǔ)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

rabbitmq消息持久化存儲(chǔ)包含三個(gè)方面

  • 1、exchange的持久化
  • 2、queue的持久化
  • 3、message的持久化

exchange的持久化

在申明exchange的時(shí)候,有個(gè)參數(shù):durable。

當(dāng)該參數(shù)為true,則對(duì)該exchange做持久化,重啟rabbitmq服務(wù)器,該exchange不會(huì)消失。

durable的默認(rèn)值為true

public class DirectExchange extends AbstractExchange {
    public static final DirectExchange DEFAULT = new DirectExchange("");
    public DirectExchange(String name) {
        super(name);
    }
    public DirectExchange(String name, boolean durable, boolean autoDelete) {
        super(name, durable, autoDelete);
    }
    public DirectExchange(String name, boolean durable, boolean autoDelete, Map<String, Object> arguments) {
        super(name, durable, autoDelete, arguments);
    }
    public final String getType() {
        return "direct";
    }
}
public abstract class AbstractExchange extends AbstractDeclarable implements Exchange {
    private final String name;
    private final boolean durable;
    private final boolean autoDelete;
    private final Map<String, Object> arguments;
    private volatile boolean delayed;
    private boolean internal;
    public AbstractExchange(String name) {
        this(name, true, false);
    }
    public AbstractExchange(String name, boolean durable, boolean autoDelete) {
        this(name, durable, autoDelete, (Map)null);
    }
    public AbstractExchange(String name, boolean durable, boolean autoDelete, Map<String, Object> arguments) {
        this.name = name;
        this.durable = durable;
        this.autoDelete = autoDelete;
        if (arguments != null) {
            this.arguments = arguments;
        } else {
            this.arguments = new HashMap();
        }
    }

queue的持久化

申明隊(duì)列時(shí)也有個(gè)參數(shù):durable。

當(dāng)該參數(shù)為true,則對(duì)該queue做持久化,重啟rabbitmq服務(wù)器,該queue不會(huì)消失。

durable的默認(rèn)值為true

public Queue(String name) {
        this(name, true, false, false);
    }
    public Queue(String name, boolean durable) {
        this(name, durable, false, false, (Map)null);
    }
    public Queue(String name, boolean durable, boolean exclusive, boolean autoDelete) {
        this(name, durable, exclusive, autoDelete, (Map)null);
    }
    public Queue(String name, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments) {
        Assert.notNull(name, "'name' cannot be null");
        this.name = name;
        this.actualName = StringUtils.hasText(name) ? name : Base64UrlNamingStrategy.DEFAULT.generateName() + "_awaiting_declaration";
        this.durable = durable;
        this.exclusive = exclusive;
        this.autoDelete = autoDelete;
        this.arguments = (Map)(arguments != null ? arguments : new HashMap());
    }

message的持久化

前面我們已經(jīng)講到exchange與queue的持久化,那么message如何持久化呢?

我們?cè)谑褂胷abbit-client做消息持久化時(shí),設(shè)置了BasicProperties的deliveryMode為2,做消息的持久化。

AMQP.BasicProperties properties = new AMQP.BasicProperties.
                Builder().
                deliveryMode(2).
                build();
        channel.basicPublish("ex.pc", "key.pc",  properties, "hello world".getBytes());

那么整合了spring boot,使用RabbitTemplate如何做持久化?

首先,我們來到經(jīng)常的使用的消息發(fā)送方法:RabbitTemplate類下的convertAndSend

@Override
    public void convertAndSend(String exchange, String routingKey, final Object object) throws AmqpException {
        convertAndSend(exchange, routingKey, object, (CorrelationData) null);
    }

然后調(diào)用了該類下的重載方法:convertAndSend。該方法中將object 轉(zhuǎn)換成了message

@Override
    public void convertAndSend(String exchange, String routingKey, final Object object,
            @Nullable CorrelationData correlationData) throws AmqpException {
        send(exchange, routingKey, convertMessageIfNecessary(object), correlationData);
    }

在做消息轉(zhuǎn)換的時(shí)候,我們注意到,傳入了一個(gè)MessageProperties對(duì)象

protected Message convertMessageIfNecessary(final Object object) {
        if (object instanceof Message) {
            return (Message) object;
        }
        return getRequiredMessageConverter().toMessage(object, new MessageProperties());
    }

在MessageProperties中,有個(gè)deliveryMode屬性,該屬性默認(rèn)值為:MessageDeliveryMode.PERSISTENT(持久化的)

 public MessageProperties() {
        this.deliveryMode = DEFAULT_DELIVERY_MODE;
        this.priority = DEFAULT_PRIORITY;
    }
static {
    DEFAULT_DELIVERY_MODE = MessageDeliveryMode.PERSISTENT;
    DEFAULT_PRIORITY = 0;
}

消息轉(zhuǎn)換完成后,調(diào)用時(shí)同類方法的send方法

@Override
    public void send(final String exchange, final String routingKey,
            final Message message, @Nullable final CorrelationData correlationData)
            throws AmqpException {
        execute(channel -> {
            doSend(channel, exchange, routingKey, message,
                    (RabbitTemplate.this.returnCallback != null
                            || (correlationData != null && StringUtils.hasText(correlationData.getId())))
                            && RabbitTemplate.this.mandatoryExpression.getValue(
                                    RabbitTemplate.this.evaluationContext, message, Boolean.class),
                    correlationData);
            return null;
        }, obtainTargetConnectionFactory(this.sendConnectionFactorySelectorExpression, message));
    }

該方法又調(diào)用了doSend方法

public void doSend(Channel channel, String exchangeArg, String routingKeyArg, Message message, // NOSONAR complexity
            boolean mandatory, @Nullable CorrelationData correlationData)
                    throws Exception { // NOSONAR TODO: change to IOException in 2.2.
        String exch = exchangeArg;
        String rKey = routingKeyArg;
        if (exch == null) {
            exch = this.exchange;
        }
        if (rKey == null) {
            rKey = this.routingKey;
        }
        if (logger.isDebugEnabled()) {
            logger.debug("Publishing message " + message
                    + "on exchange [" + exch + "], routingKey = [" + rKey + "]");
        }
        Message messageToUse = message;
        MessageProperties messageProperties = messageToUse.getMessageProperties();
        if (mandatory) {
            messageProperties.getHeaders().put(PublisherCallbackChannel.RETURN_LISTENER_CORRELATION_KEY, this.uuid);
        }
        if (this.beforePublishPostProcessors != null) {
            for (MessagePostProcessor processor : this.beforePublishPostProcessors) {
                messageToUse = processor.postProcessMessage(messageToUse, correlationData);
            }
        }
        setupConfirm(channel, messageToUse, correlationData);
        if (this.userIdExpression != null && messageProperties.getUserId() == null) {
            String userId = this.userIdExpression.getValue(this.evaluationContext, messageToUse, String.class);
            if (userId != null) {
                messageProperties.setUserId(userId);
            }
        }
        sendToRabbit(channel, exch, rKey, mandatory, messageToUse);
        // Check if commit needed
        if (isChannelLocallyTransacted(channel)) {
            // Transacted channel created by this template -> commit.
            RabbitUtils.commitIfNecessary(channel);
        }
    }

在該方法中我們終于看到了發(fā)送消息到rabbitmq的操作:sendToRabbit。

該方法將MessageProperties對(duì)象轉(zhuǎn)換成了BasicProperties。

至此,我們終于了解了,spring rabbit 中如何實(shí)現(xiàn)messge的持久化。

默認(rèn)的message就是持久化的

protected void sendToRabbit(Channel channel, String exchange, String routingKey, boolean mandatory,
            Message message) throws IOException {
        BasicProperties convertedMessageProperties = this.messagePropertiesConverter
                .fromMessageProperties(message.getMessageProperties(), this.encoding);
        channel.basicPublish(exchange, routingKey, mandatory, convertedMessageProperties, message.getBody());
    }

如何改變message的持久化屬性?

根據(jù)上面的源碼分析,spring中默認(rèn)的message就是持久化的,如何改變持久化屬性?

1、使用send方法,發(fā)送message。設(shè)置message中MessageProperties的屬性deliveryMode

2、自定義MessageConverter,在消息轉(zhuǎn)換時(shí),設(shè)置MessageProperties的屬性deliveryMode

3、自定MessagePropertiesConverter,在MessageProperties對(duì)象轉(zhuǎn)換成BasicProperties時(shí),設(shè)置deliveryMode

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 使用JavaSE來模擬斗地主

    使用JavaSE來模擬斗地主

    這篇文章主要介紹了使用JavaSE來模擬斗地主,對(duì)棋牌游戲有研究的同學(xué)可以參考一下
    2021-04-04
  • Java中l(wèi)ist.foreach()和list.stream().foreach()用法詳解

    Java中l(wèi)ist.foreach()和list.stream().foreach()用法詳解

    在Java中List是一種常用的集合類,用于存儲(chǔ)一組元素,List提供了多種遍歷元素的方式,包括使用forEach()方法和使用Stream流的forEach()方法,這篇文章主要給大家介紹了關(guān)于Java中l(wèi)ist.foreach()和list.stream().foreach()用法的相關(guān)資料,需要的朋友可以參考下
    2024-07-07
  • Spring 事務(wù)神器TransactionTemplate用法及避坑指南

    Spring 事務(wù)神器TransactionTemplate用法及避坑指南

    TransactionTemplate是Spring框架提供的編程式事務(wù)管理模板類,它結(jié)合了聲明式事務(wù)和編程式事務(wù)的優(yōu)點(diǎn),解決了復(fù)雜場景下的事務(wù)控制問題,本文給大家介紹Spring 事務(wù)神器TransactionTemplate 全解析,感興趣的朋友跟隨小編一起看看吧
    2025-12-12
  • SpringBoot監(jiān)聽Nacos動(dòng)態(tài)修改日志級(jí)別的操作方法

    SpringBoot監(jiān)聽Nacos動(dòng)態(tài)修改日志級(jí)別的操作方法

    線上系統(tǒng)的日志級(jí)別一般都是 INFO 級(jí)別,有時(shí)候需要查看 WARN 級(jí)別的日志,所以需要?jiǎng)討B(tài)修改日志級(jí)別,微服務(wù)項(xiàng)目中使用 Nacos 作為注冊(cè)中心,我們可以監(jiān)聽 Nacos 配置,修改日志級(jí)別,這篇文章主要介紹了SpringBoot監(jiān)聽Nacos動(dòng)態(tài)修改日志級(jí)別的操作方法,需要的朋友可以參考下
    2023-12-12
  • SpringBoot實(shí)現(xiàn)Excel異步導(dǎo)出的完整實(shí)戰(zhàn)方案

    SpringBoot實(shí)現(xiàn)Excel異步導(dǎo)出的完整實(shí)戰(zhàn)方案

    在企業(yè)級(jí)后端系統(tǒng)中,Excel導(dǎo)出是一個(gè)幾乎繞不過去的功能點(diǎn),無論是報(bào)表系統(tǒng)還是后臺(tái)管理系統(tǒng),下面小編就為大家介紹一個(gè)SpringBoot異步導(dǎo)出Excel的完整實(shí)戰(zhàn)方案吧
    2025-11-11
  • springboot使用之多個(gè)filter的執(zhí)行順序以及配置方式

    springboot使用之多個(gè)filter的執(zhí)行順序以及配置方式

    這篇文章主要介紹了springboot使用之多個(gè)filter的執(zhí)行順序以及配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • MyBatis 實(shí)現(xiàn)數(shù)據(jù)的批量新增和刪除的操作

    MyBatis 實(shí)現(xiàn)數(shù)據(jù)的批量新增和刪除的操作

    這篇文章主要介紹了MyBatis 實(shí)現(xiàn)數(shù)據(jù)的批量新增和刪除的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • 常用數(shù)據(jù)庫的驅(qū)動(dòng)程序及JDBC URL分享

    常用數(shù)據(jù)庫的驅(qū)動(dòng)程序及JDBC URL分享

    這篇文章主要介紹了常用數(shù)據(jù)庫的驅(qū)動(dòng)程序及 JDBC URL,需要的朋友可以看下
    2014-01-01
  • Java實(shí)現(xiàn)導(dǎo)出Excel功能

    Java實(shí)現(xiàn)導(dǎo)出Excel功能

    通過java中Controller層,來接受請(qǐng)求,數(shù)據(jù)庫查詢到的數(shù)據(jù)進(jìn)行封裝,然后使用ExcelUtils進(jìn)行輸出,接下來通過本文給大家分享Java實(shí)現(xiàn)導(dǎo)出Excel功能的實(shí)例代碼,感興趣的朋友跟隨小編一起看看吧
    2021-11-11
  • 阿里巴巴 Sentinel + InfluxDB + Chronograf 實(shí)現(xiàn)監(jiān)控大屏

    阿里巴巴 Sentinel + InfluxDB + Chronograf 實(shí)現(xiàn)監(jiān)控大屏

    這篇文章主要介紹了阿里巴巴 Sentinel + InfluxDB + Chronograf 實(shí)現(xiàn)監(jiān)控大屏,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09

最新評(píng)論

裕民县| 平阳县| 略阳县| 大邑县| 民丰县| 教育| 康平县| 浏阳市| 合水县| 化德县| 科尔| 北京市| 普定县| 来凤县| 雷州市| 鄂托克前旗| 沁源县| 隆德县| 酒泉市| 吉木乃县| 清原| 南漳县| 保德县| 剑川县| 宁武县| 枣庄市| 江达县| 怀宁县| 万源市| 盐山县| 屯昌县| 阿鲁科尔沁旗| 云浮市| 乌拉特后旗| 高台县| 东平县| 齐河县| 黄冈市| 鸡西市| 浙江省| 寿光市|