RabbitMQ开发向导

22 篇文章 0 订阅
9 篇文章 0 订阅

前言

其实通过之前讲的入门知识
还有示例,大概就能了解怎么进行开发,这里大概对其中的一些配置进行分析吧。

一、Queue

首先我们看Queue类的代码

public class Queue extends AbstractDeclarable {
    public static final String X_QUEUE_MASTER_LOCATOR = "x-queue-master-locator";
    private final String name;
    private final boolean durable;
    private final boolean exclusive;
    private final boolean autoDelete;
    private final Map<String, Object> arguments;
    private volatile String actualName;

    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());
    }


}

我把上边那些getter和setter省略了,主要展示属性和构造方法。下面展示各属性的含义:

  • name: 队列的名称;
  • actualName: 队列的真实名称,默认用name参数,如果name为空,则根据规则生成一个;
  • durable: 是否持久化;
  • exclusive: 是否独享、排外的;
  • autoDelete: 是否自动删除;
  • arguments:队列的其他属性参数,有以下参数:
    x-message-ttl:消息的过期时间,单位:毫秒;
    x-expires:队列过期时间,队列在多长时间未被访问将被删除,单位:毫秒;
    x-max-length:队列最大长度,超过该最大值,则将从队列头部开始删除消息;
    x-max-length-bytes:队列消息内容占用最大空间,受限于内存大小,超过该阈值则从队列头部开始删除消息;
    x-overflow:设置队列溢出行为。这决定了当达到队列的最大长度时消息会发生什么。有效值是drop-head、reject-publish或reject-publish-dlx。仲裁队列类型仅支持drop-head;
    x-dead-letter-exchange:死信交换器名称,过期或被删除(因队列长度超长或因空间超出阈值)的消息可指定发送到该交换器中;
    x-dead-letter-routing-key:死信消息路由键,在消息发送到死信交换器时会使用该路由键,如果不设置,则使用消息的原来的路由键值
    x-single-active-consumer:表示队列是否是单一活动消费者,true时,注册的消费组内只有一个消费者消费消息,其他被忽略,false时消息循环分发给所有消费者(默认false)
    x-max-priority:队列要支持的最大优先级数;如果未设置,队列将不支持消息优先级;
    x-queue-mode(Lazy mode):将队列设置为延迟模式,在磁盘上保留尽可能多的消息,以减少RAM的使用;如果未设置,队列将保留内存缓存以尽可能快地传递消息;
    x-queue-master-locator:在集群模式下设置镜像队列的主节点信息。
    使用示例:
     public Queue queue() {
       Map<String, Object> arguments = Maps.newHashMap();
       arguments.put("x-message-ttl", 300000);  //设置消息过期时间为5分钟
       Queue queue = new Queue("queueName", true, false, false, arguments);
       return queue;
    }
    

二、Exchange

不同的Exchange都继承于

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();
        }

    }
  • name:名称
  • Durable:持久化标志,如果为true,则表明此exchange是持久化的。
  • Auto-delete:删除标志,当所有队列在完成使用此exchange时,是否删除
  • delayed:如果要将交换声明为“x-delayed-message”交换,则返回true。需要代理上的延迟消息交换插件。需要在节点上延迟消息交换。默认false
    durable: 是否持久化;
  • internal:是否是内部的。
  • arguments 一些结构化参数

然后要使用某种交换器时直接new一个就好 比如

 @Bean
    DirectExchange MyDirectExchange() {
        //  return new DirectExchange("TestDirectExchange",true,true);
        return new DirectExchange(env.getProperty("mq.provider.exchange"),true,false);
    } 

三、队列与交换机的绑定

如下边示例即可

@Bean
    Binding bindingDirect() {
        return BindingBuilder.bind(MyDirectQueue())  //需要绑定的队列
                .to(MyDirectExchange())  //需要绑定的交换器
                .with(env.getProperty("mq.provider.routing"));  //绑定的键
    }

四、消费者两种消费模式

RabbitMQ的消费模式为推(push)模式和拉(pull)模式
push使用rabbitlistener

@Component
@RabbitListener(queues = "${mq.consumer.queue}")//监听的队列名称 TestDirectQueue
@RabbitListener(
)
public class Listener {

    @RabbitHandler
    public void process(Map testMessage) {
        System.out.println("DirectReceiver消费者收到消息  : " + testMessage.toString());
    }
  
}

拉是如下这样,主要是依靠 rabbitmqtemplate.receive方法

@RestController
public class ReceiveController {
    @Autowired
    RabbitTemplate rabbitTemplate;

    @Autowired
    Environment env;

    @GetMapping("/get")
    public String  get(){
        Map<String,Object> res = (Map<String,Object>) rabbitTemplate.receiveAndConvert(env.getProperty("mq.consumer.queue"));
        return res.toString();
    }

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值