mq的模式
work模式
将任务封装为消息并将其发送到队列,一个消息只能被一个消费者获取。
P --> exchange <-- C1 + C2 + C3 + ...
一个生产者,多个消费者,哪个抢到了就哪个消费;
同时使用basicQos方法和prefetchCount = 1设置。 这告诉RabbitMQ一次不要向工作人员发送多于一条消息。 或者换句话说,不要向工作人员发送新消息,直到它处理并确认了前一个消息。 相反,它会将其分派给不是仍然忙碌的下一个工作人员。
// 声明队列
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
订阅模式
一个生产者,多个消费者,每个消费者都有自己的队列;生产者发送消息给了
交换机而不是队列;交换机只转发消息,不储存消息,如果没有绑定符合规则的队列,则消息丢失。
交换机处理消息的方式不同,又可以分为以下几种:
订阅Fandout广播方式
交换机类型handout
生产者发送消息到交换机
消费者绑定队列到交换机
订阅Direct模式
交换机与队列绑定,并指定routingkey,消费者可以同时绑定多个routingkey
生产者发送消息时,也必须指定routingkey
订阅topic模式
routingkey一般有多个单词以.
分割,#
匹配一个或者多个单词, *
匹配一个单词
消息持久化
exchange,queue都开启持久化才可以信息持久化
spring ampq
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
@Component
public class Listener {
@RabbitListener(bindings = @QueueBinding(
value = @Queue(value = "spring.test.queue", durable = "true"),
exchange = @Exchange(
value = "spring.test.exchange",
ignoreDeclarationExceptions = "true",
type = ExchangeTypes.TOPIC
),
key = {"#.#"}))
public void listen(String msg){
System.out.println("接收到消息:" + msg);
}
}
-
@Componet
:类上的注解,注册到Spring容器 -
@RabbitListener
:方法上的注解,声明这个方法是一个消费者方法,需要指定下面的属性:-
bindings
:指定绑定关系,可以有多个。值是@QueueBinding
的数组。@QueueBinding
包含下面属性:value
:这个消费者关联的队列。值是@Queue
,代表一个队列
-
exchange
:队列所绑定的交换机,值是@Exchange
类型key
:队列和交换机绑定的RoutingKey
-
AmqpTemplate消息发送模板,常用的三个方法
- 指定交换机、RoutingKey和消息体
- 指定消息
- 指定RoutingKey和消息,会向默认的交换机发送消息