1.RabbitMQ的结构和概念
2.SpringAMQP
3.常见的消息模型
3.1基本消息队列
(1)HelloWorld类型
该模型的官方介绍:RabbitMQ tutorial - "Hello world!" — RabbitMQ
该模型中具有三个角色:
使用Amqp实现消息发送 :
<1>给父项目中添加依赖
<!--AMQP依赖,包含RabbitMQ--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency>
<2>配置RabbitMQ的地址(在application.yml文件中)
#添加rabbitmq的配置 spring: rabbitmq: host: 192.168.14.129 #rabbitmq的主机地址 port: 5672 #rabbitmq的端口号 username: itcast password: 123321 virtual-host: /
<3>使用RabbitTemplate的convertAndSend方法发送消息
@Autowired private RabbitTemplate rabbitTemplate; @Test public void testSendMessage2SimpleQueue() { String queueName = "simple.queue"; String message = "hello,spring amqp!"; // 使用amqp需要在convertAndSend方法中添加连个参数 // 分别为queueName队列名称 和 message消息具体内容 rabbitTemplate.convertAndSend(queueName, message); }
使用Amqp实现消息接收 :
<1>导入依赖(与发送相同)
<2>添加mq连接信息(与发送相同)
<3>在consumer中新添加一个类,编写消费逻辑
@Component public class SpringRabbitListener { //可监听多个也可监听一个 @RabbitListener(queues = "simple.queue") public void listenSimpleQueue(String message) { System.out.println("消费者接收到simple.queue中的消息: " + message); } }
3.2工作消息队列
该模型的官方介绍:RabbitMQ tutorial - Work Queues — RabbitMQ
listener: direct: prefetch: 1 #每次只能收到一条消息,只有在这条消息处理完后并ack,才能继续获取下一条消息
3.3发布订阅,根据交换机分为三种
(1)广播
该模型的官方介绍:RabbitMQ tutorial - Publish/Subscribe — RabbitMQ
使用SpringAMQP实现该方法:
<1>在consumer中添加一个config类
@Configuration public class FanoutConfig { //声明一个交换机exchange1 @Bean public FanoutExchange fanoutExchange() { return new FanoutExchange("itcast.fanout"); } //声明一个队列1 @Bean public Queue fanoutQueue1() { return new Queue("fanout.queue1"); } //绑定队列1到交换机 @Bean public Binding fanoutBinding1(Queue fanoutQueue1, FanoutExchange fanoutExchange1) { return BindingBuilder.bind(fanoutQueue1).to(fanoutExchange1); }。。。。。。可以跟上面重复添加多个队列并绑定到交换机中
<2>创建Listener方法绑定队列进行监听
@RabbitListener(queues = "fanout.queue1") public void listenFanoutQueue1(String message) throws InterruptedException { System.out.println("消费者接收到fanout.queue1中的消息: " + message + LocalTime.now()); }
<3>编写发布者的发布方法
public void testSendFanoutExchange() { // 交换机名称 String exchange = "itcast.fanout"; // 消息 String message = "hello,everyone!"; // 发送消息 rabbitTemplate.convertAndSend(exchange, message); }
(2)路由
该模型的官方介绍:RabbitMQ tutorial - Routing — RabbitMQ
一个队列在绑定exchange时可以指定多个key
<1>绑定队列交换机以及设置key值
<2>编写发布者方法
(3)主题
该模型的官方介绍:RabbitMQ tutorial - Topics — RabbitM
<1>在consumer方法中声明Exchange、Queue并利用@RabbitListener来声明Exchange、queue、RoutingKey
<3>创建Publisher方法
4.SpringAMQP的消息转换器
(1)publisher中配置消息转换器
(2)consumer中配置消息转换器