前言
其实通过之前讲的入门知识
还有示例,大概就能了解怎么进行开发,这里大概对其中的一些配置进行分析吧。
一、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();
}
}