SpringBoot与消息中间件(RabbitMQ)的基本使用

本文详细介绍了在Linux环境下安装并配置RabbitMQ的过程,包括修改端口设置、创建交换机和队列,以及通过浏览器进行基本测试。进一步地,文章深入讲解了如何在SpringBoot项目中集成RabbitMQ,包括配置属性、定义实体类、自定义序列化方式、创建监听类以及编写测试类,实现消息的发送与接收。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近新的项目分配给我的任务需要用到RabbitMQ做消息中间件, RabbitMQ已经忘了好多, 今天就来回顾一下RabbitMQ的基本使用(注: 不了解RabbitMQ的请参考: https://blog.csdn.net/w1316022737/article/details/83820050)

  1. 在Liunx环境下安装RabbitMQ, 在安装好启动的时候我已经将访问外部的端口号改为15672, 所以在外部直接引用就行了

  2. 先从浏览器端做基本测试

  3. 打开浏览器访问RabbitMQ, 地址为Liunx系统的ip加RabbitMQ端口号15672, 看到如下界面:
    在这里插入图片描述
    RabbitMQ管理页面用户名和密码默认都使用的是guest

  4. 登录进去之后, 在Exchanges下创建交换机, 如图:
    在这里插入图片描述
    Name中填写交换机的名称, Type选择类型, 其他默认, 直接Add即可

  5. 接着在Queues中添加队列, 如图:
    在这里插入图片描述

  6. 接着在Exchanges中给自己添加的交换机添加路由键, 如图:
    在这里插入图片描述
    To queue属性中填写的是要个那个队列绑定, Routing key中填写的是路由键, 接下来就给每个交换机发送消息, 看对应的队列是否能收到, 自行测试

  7. 代码测试
    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("三国演义", "罗贯中"));
    }

测试完毕

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值