最近新的项目分配给我的任务需要用到RabbitMQ做消息中间件, RabbitMQ已经忘了好多, 今天就来回顾一下RabbitMQ的基本使用(注: 不了解RabbitMQ的请参考: https://blog.csdn.net/w1316022737/article/details/83820050)
-
在Liunx环境下安装RabbitMQ, 在安装好启动的时候我已经将访问外部的端口号改为15672, 所以在外部直接引用就行了
-
先从浏览器端做基本测试
-
打开浏览器访问RabbitMQ, 地址为Liunx系统的ip加RabbitMQ端口号15672, 看到如下界面:
RabbitMQ管理页面用户名和密码默认都使用的是guest -
登录进去之后, 在Exchanges下创建交换机, 如图:
Name中填写交换机的名称, Type选择类型, 其他默认, 直接Add即可 -
接着在Queues中添加队列, 如图:
-
接着在Exchanges中给自己添加的交换机添加路由键, 如图:
To queue属性中填写的是要个那个队列绑定, Routing key中填写的是路由键, 接下来就给每个交换机发送消息, 看对应的队列是否能收到, 自行测试 -
代码测试
1). 创建一个SpringBoot项目, 首先配置application.properties文件
spring.rabbitmq.host=自己Liunx系统的ip
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
2). 创建一个测试实体类
public class Book {
private String BookName;
private String Bookauthor;
public Book() {
}
public Book(String bookName, String bookauthor) {
BookName = bookName;
Bookauthor = bookauthor;
}
public String getBookName() {
return BookName;
}
public void setBookName(String bookName) {
BookName = bookName;
}
public String getBookauthor() {
return Bookauthor;
}
public void setBookauthor(String bookauthor) {
Bookauthor = bookauthor;
}
}
3). 创建一个自定义序列化方式的config方法
@Configuration
public class MyAMQPConfig {
/**
* 序列化时默认采用的是jdk序列化方式,我们自己要定义一个方式,不使用默认的jdk方式
* @return
*/
@Bean
public MessageConverter messageConverter(){
return new Jackson2JsonMessageConverter();
}
}
4). 创建一个监听RabbitMQ消息的监听类
@Service
public class BookService {
/**
* 使用Rabbitmq监听消息,RabbitListener注解是监听注解,queues是监听那个消息队列
* 如果想让该监听机制起作用,必须在SpringBoot主方法上添加注解EnableRabbit
* @param book
*/
@RabbitListener(queues = 这块填写的是对应的消息队列名称)
public void receive(Book book){
System.out.println("收到消息:"+book);
}
/**
* 使用监听机制,如果参数使用Message就可以分别获取消息头和消息体
* @param message
*/
@RabbitListener(queues = 这块填写的是对应的消息队列名称)
public void receive02(Message message){
//获取消息的头信息
System.out.println(message.getBody());
//获取消息体
System.out.println(message.getMessageProperties());
}
}
5). 编写测试类
@RunWith(SpringRunner.class)
@SpringBootTest
public class Springboot02AmqpApplicationTests {
@Autowired
RabbitTemplate rabbitTemplate;
//AmqpAdmin:RabbitMQ系统管理功能组件AmqpAdmin创建和删除Queue,Exchange,Binding
@Autowired
AmqpAdmin amqpAdmin;
/**
* AmqpAdmin:RabbitMQ系统管理功能组件
* AmqpAdmin创建和删除Queue,Exchange,Binding
*/
@Test
public void createExchange() {
//创建一个direct点对点式的exchange(交换器)
/*amqpAdmin.declareExchange(new DirectExchange("amqpadmin.exchange"));
System.out.println("创建一个direct点对点式的exchange成功");*/
//创建一个队列,durable表示是否是持久化
/*amqpAdmin.declareQueue(new Queue("amqpadmin.queue",true));*/
/**
* 将交换器和消息队列绑定到一起,第一个destination表示的参数是要绑定的那个消息队列,
* 第二个参数为消息队列类型,第三个参数是要绑定的那个交换器,
* 第四个参数是路由键的名字,第五个参数是消息对象,如果没有可以为null
*/
amqpAdmin.declareBinding(new Binding("amqpadmin.queue", Binding.DestinationType.QUEUE, "amqpadmin.exchange", "amqp", null));
}
/**
* direct点对点,单播练习
* 序列化时默认采用的是jdk序列化方式,我们自己要定义一个方式,不使用默认的jdk方式,在MyAMQPConfig类中配置
*/
@Test
public void contextLoads() {
//Message需要自己构造一个,定义消息体内容和消息头
//rabbitTemplate.send(exchage,routeKey,message);
//exchage:交换器,routeKey:路由键,object:要发送的数据对象,下面这个对象就会默认被当成消息体,而且会自动转换
//object默认被当成消息体,只需要传入要发送的对象,自动序列化发送给rabbitmq
//rabbitTemplate.convertAndSend(exchage,routeKey,object);
Map<String, Object> map = new HashMap<>();
map.put("msg", "这是第一个消息");
map.put("data", Arrays.asList("helloword", 123, true));
//对象被默认序列化后发送出去
//rabbitTemplate.convertAndSend(这块填写的是创建的交换机的名称,这块填写的是对应的消息队列名称,map);
//自己定义了一个类发送一个类看是否能够成功
rabbitTemplate.convertAndSend(这块填写的是创建的交换机的名称,这块填写的是对应的消息队列名称, new Book("西游记", "吴承恩"));
}
/**
* direct点对点单播,接收消息队列中的数据,如何将数据转为json
*/
@Test
public void receive() {
Object o = rabbitTemplate.receiveAndConvert(这块填写的是对应的消息队列名称);
//获取到的数据类型
System.out.println(o.getClass());
//获取到的数据
System.out.println(o);
}
/**
* fanout广播方式
*/
@Test
public void sendMsg() {
rabbitTemplate.convertAndSend(这块填写的是创建的交换机的名称, "", new Book("三国演义", "罗贯中"));
}
测试完毕