SpringBoot整合RabbitMQ

一、RabbitMQ简介

RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue Protocol)的开源实现

1、核心概念

Message
消息,由消息头和消息体组成。
消息头则是由一系列的可选属性组成:
①routing-key(路由键)
②priority:相对于其他消息的优先权
③delivery-mode:指出该消息可能需要持久性存储
消息体是不透明的。

Publisher
消息的生产者,也是一个向交换器发布消息的客户端应用程序

Exchange
交换器,用于接收生产者发送的消息并将这些消息路由给服务器中的队列。
Exchange有4种类型:
①direct:默认
②fanout
③topic
④headers

Queue
消息队列。用于保存消息直到发送给消费者。

Binding
绑定,用于消息队列和交换器之间的关联。
Exchange和Queue的绑定可以是多对多的关系。

Connection
网络连接,比如一个TCP连接

Channel
信道,多路复用连接中的一个独立的双向数据流通道。信道是建立在真实的TCP连接内的虚拟连接,AMQP命令都是通过信道发出的,不管是发布消息、订阅队列、还是接收消息,这些动作都是通过信道完成的。

Consumer
消息的消费者,表示从一个消息队列中取得消息的客户端应用程序。

2、运行机制

生产者(producer)生产消息(message),发送给服务器(broker),然后服务器将消息交给交换器(exchage),交换器根据消息中的消息头所携带的路由键(routing-key)的绑定规则(binding),将其交给对应的消息队列(queue),最后消费者(consumer)从消息队列中取出消息进行消费。
SpringBoot整合RabbitMQ_第1张图片

二、安装RabbitMQ

我们将使用docker在Linux虚拟机上安装RabbitMQ。

1、下载(下载带管理界面的版本)
docker pull docker.io/rabbitmq:3-management
SpringBoot整合RabbitMQ_第2张图片

2、启动RabbitMQ
docker run -d -p 5672:5672 -p 15672:15672 --name myrabbitmq 6a98e7057e36
SpringBoot整合RabbitMQ_第3张图片

3、访问RabbitMQ的客户端工具
SpringBoot整合RabbitMQ_第4张图片
SpringBoot整合RabbitMQ_第5张图片

三、SpringBoot整合RabbitMQ

1、引入依赖


     org.springframework.boot
     spring-boot-starter-amqp
 

2、application.properties配置

spring.rabbitmq.host=192.168.199.220
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.rabbitmq.port=5672

3、开启基于注解的RabbitMQ

@EnableRabbit
@SpringBootApplication
public class SpringbootRabbitmqApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootRabbitmqApplication.class, args);
    }

}

4、配置自定义消息序列化方式

@Configuration
public class MyAMQPConfig {
    @Bean
    public MessageConverter messageConverter(){
        return new Jackson2JsonMessageConverter();
    }
}

5、测试相关代码

@SpringBootTest
class SpringbootRabbitmqApplicationTests {


    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Autowired
    AmqpAdmin amqpAdmin;

    @Test
    public void createExchange(){
        Exchange exchange = new DirectExchange("amqpadmin.exchange");
        amqpAdmin.declareExchange(exchange);
        System.out.println("创建完成");
    }

    @Test
    public void createBinding(){
        Binding binding = new Binding("amqpadmin.queue", Binding.DestinationType.QUEUE,"amqpadmin.exchange","amqp.haha",null);
        amqpAdmin.declareBinding(binding);
        System.out.println("binding成功");
    }

    @Test
    public void createQueue(){
        amqpAdmin.declareQueue(new Queue("amqpadmin.queue",true));
        System.out.println("queue创建完成");
    }

    /**
     * 1、单播(点对点)
     */
    @Test
    void contextLoads() {
        //rabbitTemplate.send(exchange,routeKey,message);
        //object默认当成消息体,只需要传入要发送的对象,自动序列化发送给rabbitmq
        //rabbitTemplate.convertAndSend(exchange,routeKey,object);
        Map map = new HashMap<>();
        map.put("msg","first message");
        map.put("data",Arrays.asList("hello","world",123,true));
//        rabbitTemplate.convertAndSend("exchange.dirct","atguigu.news",map);
        rabbitTemplate.convertAndSend("exchange.dirct","atguigu.news",new Student("彭大大","男"));
    }

    @Test
    public void receive(){
        Object o = rabbitTemplate.receiveAndConvert("atguigu.news");
        System.out.println(o.getClass());
        System.out.println(o);
    }

    /**
     * 广播
     */
    @Test
    public void sendMsg(){
        rabbitTemplate.convertAndSend("exchange.fanout","",new Student("彭小小","女"));
    }

}

相关代码已上传到git上:https://github.com/pengyufenga/springboot_study.git

你可能感兴趣的:(SpringBoot整合RabbitMQ)