Spring boot集成RabbitMQ中Exchange与Queue参数详解

关于springBoot整合RabbitMQ及基本使用可以参考:springBoot整合RabbitMQ及基本使用

FanoutExchange、DirectExchange、TopicExchange:

  • durable : 为true,声明exchange是持久化的,当RabbitMQ崩溃了重启后exchange仍然存在;
  • autoDelete : 当该exchange所有的队列都被unbind之后,该exchange自动被删除;

设置exchange为持久化之后,并不能保证消息不丢失,因为此时发送往exchange中的消息并不是持久化的,需要配置delivery_mode=2指明message为持久的。

在FanoutExchange中,会将发送的消息封装为 Message 对象,该对象中有一个 MessageProperties 对象,用来指定消息的属性,而 MessageProperties 中默认的 deliveryMode 属性为 MessageDeliveryMode.PERSISTENT ,查看源码得知,MessageDeliveryMode.PERSISTENT = 2,所以 FanoutExchange 发送的消息默认就是持久化的。

static {
        DEFAULT_DELIVERY_MODE = MessageDeliveryMode.PERSISTENT;
        DEFAULT_PRIORITY = 0;
    }

public enum MessageDeliveryMode {
    NON_PERSISTENT,
    PERSISTENT;

    private MessageDeliveryMode() {
    }

    public static int toInt(MessageDeliveryMode mode) {
        switch(mode) {
        case NON_PERSISTENT:
            return 1;
        case PERSISTENT:
            return 2;
        default:
            return -1;
        }
    }
    ......
}

Queue :

  • durable : 为true,声明 queue 是持久化的,当RabbitMQ崩溃重启后 queue 仍然存在;
  • exclusive: 为true,声明该 queue 为排他队列,如果一个队列被声明为排他队列,该队列仅对首次声明它的连接可见,并在连接断开时自动删除该 queue,也就是当 connection 断开后,该 queue 就会被删除;
  • autoDelete : 为true,当所有订阅了该 queue 的 consumer 从RabbitMQ断开后就会删除该queue,或者是当 connection 断开后,该 queue 就会被删除,与 exclusive 不同的是,如果一开始就没有 consumer 连接到该 queue,那么该 queue 将不会被删除;

durable属性和auto-delete属性可以同时生效;
durable属性和exclusive属性会有性质上的冲突,两者同时设置时,仅exclusive属性生效;
auto_delete属性和exclusive属性可以同时生效;
参考: https://yq.aliyun.com/articles/42205

你可能感兴趣的:(Spring boot集成RabbitMQ中Exchange与Queue参数详解)