RabbitMq学习
工作原理
组成部分说明:
- Broker:消息队列服务进程,此进程包括两个部分:Exchange和Queue
- Exchange:消息队列交换机,按一定的规则将消息路由转发到某个队列,对消息进行过虑。
- Queue:消息队列,存储消息的队列,消息到达队列并转发给指定的
- Producer:消息生产者,即生产方客户端,生产方客户端将消息发送
- Consumer:消息消费者,即消费方客户端,接收MQ转发的消息。
消息确认机制(ACK)
RabbitMQ有一个ACK机制。当消费者获取消息后,会向RabbitMQ发送回执ACK,告知消息已经被接收。不过这种回执ACK分两种情况:
- 自动ACK:消息一旦被接收,消费者自动发送ACK
- 手动ACK:消息接收后,不会发送ACK,需要手动调用
Springboot整合MQ
依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId><version>2.6.13</version>
</dependency>
server:port: 10200
spring:rabbitmq:host: 10.0.0.177port: 5672username: xxxpassword: xxxvirtual-host: learn
配置类,配一个队列出来
@Configuration
public class RabbitConfig {@BeanQueue simpleQueue(){return new Queue("Learn_MyQueue_test",true);}
}
springboot启动后不断监听mq的消息
@Component
public class HelloConsume {@RabbitListener(queues = "Learn_MyQueue_test")public void receive(String msg){System.out.println("hello receive:"+msg);}
}
使用test单元,模拟发送一条消息
@SpringBootTest
class LearnMqApplicationTests {@AutowiredRabbitTemplate rabbitTemplate;@Testpublic void testSend() {rabbitTemplate.convertAndSend( "Learn_MyQueue_test","生产者发送的消息!");}
}
运行boot后,发送一条消息后,会在boot中监听到这条消息。
上面代码中可以省去配置类,直接声明队列
@RabbitListener(queuesToDeclare = @Queue(name = "Learn_MyQueue_test1"))
public void receive(String msg){System.out.println("hello receive:"+msg);
}
四种交换机
-
直接交换机(Direct Exchange):
- 适用于需要基于路由键精确匹配的场景。
- 如果接收方不想接收某些消息,可以通过不绑定相应的路由键到队列来实现。
-
主题交换机(Topic Exchange):
- 适用于需要基于模式匹配路由键的场景。
- 接收方可以通过绑定不同的模式到队列来选择性接收消息,例如使用
*
和#
通配符。
-
头交换机(Headers Exchange):
- 适用于需要根据消息的头部属性进行匹配的场景。
- 接收方可以通过设置不同的头部属性和值来选择性接收消息。
-
扇出交换机(Fanout Exchange):
- 适用于广播消息到所有绑定的队列,不考虑路由键。
- 接收方可以选择绑定到交换机的队列来接收所有消息,或者不绑定来避免接收。、
交换机例子
配置类,四个交换机,一个主题,四种绑定的方式
import org.springframework.amqp.core.*;