一、导入依赖
dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
二、配置application.xml/yml
我们这里是以我们的电脑windows为例。想要使用虚拟机上的linux系统的话,只需要更改RebbitMQ的broker(服务器)地址即可,如:spring.rabbitmq.host=192.168.127.129。
# 设置RabbitMQ的broker spring.rabbitmq.host=localhost # 设置RabbitMQ的虚拟主机 spring.rabbitmq.virtual-host=xlh # 设置RabbitMQ的帐户 spring.rabbitmq.username=guest # 设置RabbitMQ的密码 spring.rabbitmq.password=guest
三、SpringBoot为RabbitMQ准备的三样东西
SpringBoot为我们的RabbitMQ准备了三样东西:
- RabbitTemplate:管理消息的发送和接收;
- @RabbitListener:用来监视接收消息
- AmqpAdmin:用于创建交换器、创建消息队列、实现绑定等操作
一)RabbitTemplate
RabbitTemplate对消息的操作有两种:
- 文本
- java对象(常用)
1、文本
发送消息:
参数解释:交换器、路由键、message对象(消息的byte类型数组,消息的类型)
rabbitTemplate.send("dongman.direct","appach",new Message(message.getBytes(),new MessageProperties()));
接收消息:
参数解释:消息队列的名字
由于我们得到的是一个message,我们要再转回文本,则需要使用message的getBody方法,将其转回。
receive方法有个不好的点,就是当队列为空时,再取出会报空指针异常。
Message daxiong = rabbitTemplate.receive("daxiong"); String s = new String(daxiong.getBody());
2、Java对象
其实java对象也能是文本,毕竟java对象有object。
发送消息:
rabbitTemplate.convertAndSend("dongman.direct","appach",message);
接收消息:
相比于receive方法,这个方法当队列为空时,只是返回null,而不是报空指针异常。
Object daxiong = rabbitTemplate.receiveAndConvert("daxiong");
若想以json的格式发送,则只需将原来的消息转换器,由原来的默认转换器SimpleMessageConverter换成Jackson2JsonMessageConverter即可,写一个配置类
package com.example.config; import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter; import org.springframework.amqp.support.converter.MessageConverter; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MessageConfig { @Bean public MessageConverter getConverter(){ return new Jackson2JsonMessageConverter(); } }
二)@RabbitListener
主要用于监视消息队列啥时候接收到消息
- 方法上加上一个注解:@RabbitListener(queues = "daxiong"),注解属性为消息队列名
@RabbitListener(queues = "daxiong") public void receiver(String message){ System.out.println(message); }
- 再在SpringBoot主启动类上加上一个注解:@EnableRabbit
@SpringBootApplication @EnableRabbit public class ReceiverApplication { public static void main(String[] args) { SpringApplication.run(ReceiverApplication.class, args); } }
加上上面两个注解即可,@RabbitListener下的方法参数会自动匹配接收到的消息
三)AmqpAdmin
主要用于创建交换器、队列、绑定等功能。
1、创建交换器
public void creatExchange(){ ampqAdmin.declareExchange(new DirectExchange("lufei.direct")); ampqAdmin.declareExchange(new FanoutExchange("lufei.fanout")); ampqAdmin.declareExchange(new TopicExchange("lufei.topic")); }
2、创建队列
public void creatQueue(){ ampqAdmin.declareQueue(new Queue("suolong")); }
3、绑定
参数解释:队列,不知,转换器,路由键,null
public void binding(){ ampqAdmin.declareBinding(new Binding("suolong",Binding.DestinationType.QUEUE,"lufei.direct","wlygh",null)); }
四、RabbitMQ中的ACK机制
消费端取出消息,但在操作过程中出现异常导致数据丢失。
RabbitMQ特此推出ACK机制来保护我们的数据。
消费端消费完数据后,给一个反馈给RabbitMQ,RabbitMQ才会从队列中移除数据,反之不移除。
这就出现一种情况,队列中出错的数据一直消费不掉。
我们就出现了即便报错也能消费掉队列中的数据的操作,有两种方法:
1、try...catch捕获异常,给RabbitMQ一个反馈
2、重试机制:设置重试上线次数为两次。第一次取报错,数据返回;第二次取报错,数据返回;第三次取数据报错,数据不返回,从队列中移除。
重试机制RabbitMQ是默认关闭的,我们需要在application.xml中进行配置
#开启重试机制 spring.rabbitmq.listener.simple.retry.enabled=true #设置重试次数 spring.rabbitmq.listener.simple.retry.max-attempts=3