RabbitMQ和Spring AMQP学习一

RabbitMQ和Spring AMQP学习一

下载和安装

详细步骤详见官方文档

基本概念

背景知识

最初的消息模型只有三个要素,生产者、消息队列、消费者。随着消息队列的演进,RabbitMQ变为现在的消息模型。主要包含的要素为,生产者、routingKey、Exchange、Binding、Queue、消费者.

官方教程里的话也是充分说明了完整的消息模型
在这里插入图片描述

Producer

生产者:顾名思义,其作用就是生产消息。在RabbitMQ消息模型中,生产者生产的消息,会发送到Exchange。不关心谁消费。生产者眼里只有Exchange.

Routing Key

生成者在将消息发送给Exchange时,可能携带着routingKey,Exchange会根据消息中的routingKey和另一边的bindingKey根据当前Exchange的类型进行匹配。如果满足规则,则会将消息转发给bindingKey对应的Queue

Exchange

交换器.一边连着生产者,一边连着Queue.交换器的职责就是接收消息,并根据消息中携带的routingKey找到对应bindingKey的消息队列。并把消息转发出去。

Exchange的type分为:

  • 广播(fanout)即将收到的消息转发给所有连接在此Exchange上的Queue。
  • 完全匹配(direct)即当routingKey和bindingKey完全一样时才转发给对应的Queue
  • 模式匹配(topic)

Binding

Exchange和Queue之间的绑定关系。在RabbitMQ中称为Binding,具体的值称为bindingKey

Queue

消息队列,真正存储消息的地方。如果此消息队列上有消费者监听,会进行消息的消费

控制台的基本使用

控制台的默认端口为15672

设置virtual hosts

在这里插入图片描述

默认是/,如果想要控制不同的角色的连接。则可以在控制台添加配置即可
在这里插入图片描述

一般如果virtual-host配置和对应的角色对应不上,是连接不上的,一般会Connection rest。这时要检查下当前连接RabbitMQ的用户所对应的virtual-host是什么

通过控制台发送消息(发送时报No method found for class [B==解决方法)

在实际编码过程中,编写完毕之后,测试消费者是否可以正常接收到消息时,可以在对应的Exchange或者Queue下手动编写消息体进行发送
在这里插入图片描述

在对应的payload中编写消息体。这里要注意,在控制台发送消息时,一般要指定Properties,如果消费者用String接收,则Properties为content_type=text/plain.如果不设置会怎么样,一般都会报Caused by: org.springframework.amqp.AmqpException: No method found for class [B这种错误

Spring AMQP基本使用

配置Exchange、Queue、Binding

@Configuration
public class DirectExchangeConfig {
    
    @Bean
    public DirectExchange directExchange() {
        return new DirectExchange("direct");
    }
    
    @Bean
    public Queue firstDirectQueue() {
        return new Queue("firstDirect");
    }
    
    @Bean
    public Queue secondDirectQueue() {
        return new Queue("secondDirect");
    }
    
    @Bean
    public Binding firstDirectBinding() {
        return BindingBuilder.bind(firstDirectQueue()).to(directExchange()).with("first");
    }
    
    @Bean
    public Binding secondDirectBinding() {
        return BindingBuilder.bind(secondDirectQueue()).to(directExchange()).with("second");
    }
}

当前Exchange的类型为Direct,即完全匹配。通过==BindingBuilder.bind(队列).to(exchange).with(routingKey)==完成队列和Exchange之间的绑定

消费者监听消息队列,以便随时消费任务

@Component
@Slf4j
public class DirectConsumer {
    
    @RabbitListener(queues = "firstDirect")
    @RabbitHandler
    public void receiveFirstDirectQueueMessage(String firstQueueMessage) {
        log.info("This is firstDirectQueue received message: " + firstQueueMessage);
    }
    
    @RabbitListener(queues = "secondDirect")
    @RabbitHandler
    public void  receiveSecondDirectQueueMessage(String secondQueueMessage) {
        log.info("This is secondDirectQueue received message: " + secondQueueMessage);
    }
}

生产者向Exchange发送消息

携带不同的routingKey,会被Direct Exchange转发的对应的Queue上

@Component
public class DirectProducer {
    
    @Autowired
    private RabbitTemplate rabbitTemplate;
    
    @Autowired
    private DirectExchange directExchange;
    
    public void sendDirectMessage() {
        rabbitTemplate.convertAndSend(directExchange.getName(), "first", "this is send first message");
        rabbitTemplate.convertAndSend(directExchange.getName(), "second", "this is send second message");
    }
}

小技巧

在配置文件中,将rabbitmq的日志级别设置为debug。可以看到消息发送过程中打印出的日志

logging:
  level:
    org.springframework.amqp: debug

下一篇:Rabbit MQ消息模型详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值