Loading

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和消息,会向默认的交换机发送消息
    ampq发送
posted @ 2021-01-14 21:33  ly_arise  阅读(235)  评论(0编辑  收藏  举报