将任务封装为消息并将其发送到队列,一个消息只能被一个消费者获取。
P --> exchange <-- C1 + C2 + C3 + ...
一个生产者,多个消费者,哪个抢到了就哪个消费;
同时使用basicQos方法和prefetchCount = 1设置。 这告诉RabbitMQ一次不要向工作人员发送多于一条消息。 或者换句话说,不要向工作人员发送新消息,直到它处理并确认了前一个消息。 相反,它会将其分派给不是仍然忙碌的下一个工作人员。
// 声明队列
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
一个生产者,多个消费者,每个消费者都有自己的队列;生产者发送消息给了
交换机而不是队列;交换机只转发消息,不储存消息,如果没有绑定符合规则的队列,则消息丢失。
交换机处理消息的方式不同,又可以分为以下几种:
交换机类型handout
生产者发送消息到交换机
消费者绑定队列到交换机
交换机与队列绑定,并指定routingkey,消费者可以同时绑定多个routingkey
生产者发送消息时,也必须指定routingkey
routingkey一般有多个单词以.
分割,#
匹配一个或者多个单词, *
匹配一个单词
exchange,queue都开启持久化才可以信息持久化
<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消息发送模板,常用的三个方法
原文:https://www.cnblogs.com/asketch/p/14279533.html