Springboot高级(二) RabbitMQ

一、概述

  1. 大多应用中,可通过消息服务中间件来提升系统异步通信、扩展解耦能力
  2. 消息服务中两个重要概念:消息代理 (message broker) 和目的地 (destination)。
    当消息发送者发送消息以后,将由消息代理接管,消息代理保证消息传递到指定目的地。
  3. 消息队列主要有两种形式的目的地:
    ①队列 (queue):点对点消息通信 (point-to-point)
    ②主题 (topic):发布 (publish) /阅 (subscribe) 消息通信
  4. 点对点式
    ①消息发送者发送消息,消息代理将其放入一个队列中,消息接收者从队列中获取消息内容,消息读取后被移出队列。
    ②消息只有唯一的发送者和接受者,但并不是说只能有一个接收者
  5. 发布订阅式:
    发送者(发布者) 发送消息到主题,多个接收者 (订阅者)监听(订阅)这个主题,那么就会在消息到达时同时收到消息
  6. JMS(Java Message Service) JAVA消息服务
    基于JVM消息代理的规范。ActiveMQ、HornetMQ是JMS实现
  7. AMQP(Advanced Message Queuing Protocol)
    ①高级消息队列协议,也是一个消息代理的规范,兼容JMS
    ②RabbitMQ是AMQP的实现
JMSAMQP
定义Java Api网络级协议
跨语言
跨平台
Model提供两种消息模型:1、Peer-2-Peer 2、Pub/sub提供了五种消息模型:1、direct exchange 2、fanout exchange 3、topic change 4、headers exchange 5、system exchange。本质来讲,后四种和JMS的pub/sub模型没有太大差别,仅是在路由机制上做了更详细的划分
支持消息类型多种消息类型:TextMessage、MapMessage、BytesMessage、StreamMessage、ObjectMessage、Message(只有消息头和属性)byte[];当实际应用时,有复杂的消息,可以将消息序列化后发送。
综合评价JMS定义了JAVA API层面的标准;在java体系中,多个clien均可以通过JMS进行交互,不需要应用修改代码,但是其对跨言特性。平台的支持较差AMQP定义了wire-level层的协议标准;天然具有跨平台、跨语言特性。

二、架构

在这里插入图片描述

三、Exchange(交换器)类型

目前有四种:direct、 fanout、 topic、headers

(1)direct 路由键(routing key)与队列名(name)完全一致
在这里插入图片描述
(2)fanout 交换器下所有队列都接收到消息
在这里插入图片描述
(3)topic 将路由键和某个模式进行匹配 ; #匹配0个或多个单词,*匹配一个单词
在这里插入图片描述

三、安装RabbitMQ

  1. 安装erlang,下载地址:http://www.erlang.org/downloads,双击.exe文件进行安装就好。安装完成之后将erlang的安装目录(C:\ProgramFiles\erl9.1\bin,具体请查看安装路径)加入到Path中。最后打开命令行,输入erl,如果出现erlang的版本信息就表示erlang语言环境安装成功;
    在这里插入图片描述

  2. 安装RabbitMQ,下载地址:http://www.rabbitmq.com/download.html,同样双击.exe进行安装。修改RabbitMQ安装目录为 D:\SinoWeb\RabbitMQ;
    在这里插入图片描述

  3. 安装RabbitMQ-Plugins
    安装方法是:打开命令行cd进入rabbitmq的sbin目录(D:\SinoWeb\RabbitMQ\rabbitmq_server-3.6.12\sbin),输入一下安装命令
    安装命令:
    rabbitmq-plugins enable rabbitmq_management
    开通STOMP通道:
    rabbitmq-plugins enable rabbitmq_web_stomp
    rabbitmq-plugins enable rabbitmq_web_stomp_examples

  4. 插件安装完之后,双击rabbitmq-server.bat,在浏览器输入http://localhost:15672进行验证,你会看到登陆界面,输入用户名:guest,密码:guest你就可以进入管理界面;

  5. 创建用户
    使用guest账户登陆,点击Admin标签,然后点击 Add a user,在新增用户的表单中输入以下内容
    Username:sino
    Password:sino3210
    Tags: administrator
    点击Add User按钮创建用户。
    创建完毕后 新创建的用户会显示No access。点击刚才创建的sino用户名,在新页面中, 点击Set permission按钮。

四、使用RabbitMQ

(1)点击Exchanges按钮
在这里插入图片描述
(2)点击Quene按钮
在这里插入图片描述
(3)点击Exchange,绑定quene
在这里插入图片描述

五、SpringBoot整合

1、引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

1、配置文件添加属性

spring:
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: guest
    password: guest

2、代码

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Autowired
    private AmqpAdmin amqpAdmin;
	
	//发送和接收信息
    @Test
    void contextLoads() {
        //1、direct类型交换器,单个routingKey   ----SUCCESS
        rabbitTemplate.convertAndSend("text.exchange", "text.quene", 
                "我是发送到text.exchange交换器,text.quene消息队列的信息");

        //2、fauout类型交换器,routingKey不传参数  -----SUCCESS
        rabbitTemplate.convertAndSend("text.exchange2", "", 
                "我是发送到text.exchange2交换器,fauout消息队列的信息");

        //3、fauout类型交换器,不管是否传参routingKey,都发送到交换器下所以的队列   ----ERROR
        rabbitTemplate.convertAndSend("text.exchange2", "text.quene", 
                "我是发送到text.exchange2交换器,text.quene单独测试fauout消息队列的信息");

        //4、direct类型交换器,routingKey不传参数,所以的队列都不接收信息    ----ERROR
        rabbitTemplate.convertAndSend("text.exchange", "", 
                 "我是发送到text.exchange交换器,所以队列信息");

        //5、接收信息
        Object convert = rabbitTemplate.receiveAndConvert("text4.quene");
        System.err.println(convert);
    }


备注:当传输的消息是Map类型或实体类时,RabbitMQ接收的消息是转化乱码的,需转成json格式
	添加 MyAmqpConfig 配置类
    @Test
    void contextLoads() {
        Map<String, Object> map = new HashMap<>();
        map.put("msg", "这是第二个消息");
        map.put("data", Arrays.asList("HelloWorld", "小米", new Date()));
        rabbitTemplate.convertAndSend("test.direct", "five.quene", map);
    }

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

3、使用@RabbitListener监听消息队列的内容

(1)@EnableRabbit注解开启RabbitMQ
(2)在方法上标注@RabbitListener

@EnableRabbit
@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}
@Configuration
public class MyRabbitConfig {
    @Bean
    public MessageConverter messageConverter() {
        return new Jackson2JsonMessageConverter();
    }
 }
@Service
public class ReceiveService {
    
    @RabbitListener(queues = "text.quene")
    public void receive(String message){
        System.err.println(message);
        System.err.println(message.getBody());
    }
}

4、AmqpAdmin

创建和删除Quene、Exchange、Bind

	@Autowire
	AmqpAdmin amqpAdmin;

	//创建交换器和队列
    @Test
    public void createExchange(){
        //创建交换器
        amqpAdmin.declareExchange(new DirectExchange("rabDirect.exchange"));
        amqpAdmin.declareExchange(new FanoutExchange("rabFanout.exchange"));
        //创建队列
        amqpAdmin.declareQueue(new Queue("allen.quene", true));
        //绑定队列
        amqpAdmin.declareBinding(new Binding("allen.quene",
                Binding.DestinationType.QUEUE, "rabFanout.exchange",
                "allen.quene", null));
        amqpAdmin.declareBinding(new Binding("allen.quene",
                Binding.DestinationType.QUEUE, "rabDirect.exchange",
                "allen.quene", null));
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值