Advertisement

RabbitMQ的介绍/安装和SpringBoot集成简单使用(MacBook版)

阅读量:
RabbitMQ是什么?

起初打算按照老方法百度图来展示自己的作品结果觉得太过普通就决定自己动手整理一下把最真实的感受记录下来记得第一次接触 RabbitMQ 是在毕业实习期间那时候还是个青涩的应届毕业生 在一家外包公司里手忙脚乱地处理着普通的开发任务 有一次项目中负责一个秒杀功能模块 被安排使用 RabbitMQ 来进行延时入库操作完全不熟悉的感觉一开始确实让我一头雾水完全搞不懂这是什么鬼东西于是我开始了漫长的自学之旅
后来在名创优品开发一个用户邮箱系统的过程中又一次成功地应用了 RabbitMQ 这也凸显了实习生经验积累的重要性

rabbit,理解为兔子,很快很快。

MQ本质上是Message Queue(消息队列的英文缩写)。消息队列可以被比喻为管道或通道,在这种系统中信息会按照先进先出的原则流动——每当一条信息进入系统时另一条信息就会从队列的一端被释放出来。然而这个系统存储的内容并不是液体而是各种类型的消息具体存储内容则取决于业务需求比如Map这种数据结构一条SQL语句一个定时任务序列化后的对象等完全由开发者自行设计。

RabbitMQ可以干什么用?

这个话题,在网上讨论得非常热烈。随便搜索一下的话,则优缺点颇多。如削峰填谷如延时加载又如涉及多个维度的数据传输问题等都是常见讨论点。主要缺陷在于可能导致项目的可用性下降而相关服务也可能会随之崩溃。对于新用户的建议是无需准备知识即可使用;而对于资深用户而言,则无需再记忆相关内容。

安装RabbitMQ:

首先你的MACBook必须安装了brew。
然后执行:brew install rabbitmq
在这里插入图片描述

配环境

输入:sudo vi /etc/profile
填入:export RABBIT_HOME=/usr/local/Cellar/rabbitmq/3.7.15
export PATH=PATH:RABBIT_HOME/sbin
在这里插入图片描述
最后重启一下配置让它生效:source /etc/profile

启动:rabbitmq-server -detached

看下是否启动: rabbitmqctl status

有可能会出现疯狂报错(网上说是权限问题):
在这里插入图片描述
那就全部加个SUDO:
启动:sudo rabbitmq-server -detached
查看状态:sudo rabbitmqctl status
在这里插入图片描述
这样就成功了,打开浏览器输入:http://localhost:15672
看见这个可爱的兔子就是成功了:
在这里插入图片描述

下一步,SpringBoot集成:

依赖:

复制代码
    <dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-amqp</artifactId>
    			<version>1.5.2.RELEASE</version>
    		</dependency>
    
    
      
      
      
      
      
    
    代码解释
写个消息的发送端Service:
复制代码
    package com.example.demo.serivceImp;
    
    import org.springframework.amqp.rabbit.core.RabbitTemplate;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import java.util.HashMap;
    import java.util.Map;
    
    @Service
    public class RabbitMqService {
    @Autowired
    RabbitTemplate rabbitTemplate;
    
    public String sendData(int id, int password) {
        String channelNo = "jojo123";
        Map<String,Object> jojoMap = new HashMap<>();
        jojoMap.put("channelNo",channelNo);
        jojoMap.put("userId",id);
        jojoMap.put("password",password);
        rabbitTemplate.convertAndSend("jojo_channel",null,jojoMap);
        return channelNo;
    }
    }
    
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解释
写个Controller:
复制代码
    @Autowired
    private RabbitMqService rabbitMqService;
    
    @GetMapping("/rabbitMq")
    public void rabbitMq(){
        String s = rabbitMqService.sendData(1111, 22222);
        System.out.println("发送出去的:"+s);
    }
    
    
      
      
      
      
      
      
      
      
    
    代码解释
写个消息的消费端Service(每次有新消息在管道里就自动输出):
复制代码
    package com.example.demo.serivceImp;
    
    import com.rabbitmq.client.Channel;
    import org.springframework.amqp.rabbit.annotation.*;
    import org.springframework.amqp.support.AmqpHeaders;
    import org.springframework.messaging.handler.annotation.Headers;
    import org.springframework.messaging.handler.annotation.Payload;
    import org.springframework.stereotype.Component;
    
    import java.io.IOException;
    import java.util.Map;
    
    @Component
    public class RabbitAccept {
    @RabbitListener(
            bindings = @QueueBinding(
                    value = @Queue(value = "jojo_test_queue"),
                    exchange = @Exchange(value = "jojo_channel",type = "fanout")
            )
    )
    @RabbitHandler
    public void handle(@Payload Map<String,Object> dataMap, Channel channel, @Headers Map<String,Object> headers){
    
        try {
            System.out.println("接收到的:"+dataMap);
            Long tag = (Long)headers.get(AmqpHeaders.DELIVERY_TAG);
            channel.basicAck(tag,false);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    }
    
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解释
搞定收工!请求一下那个Controller,就可以看见:
在这里插入图片描述
这就证明已经发出去,然后又能从消息管道里拿回来了~这样就行啦~
再看看http://localhost:15672
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

能够观察到用于测试的各种管道、交换设备以及各个频道对应的账户信息都有详细记录的情况。我们能查看各个管道、交换设备以及各个频道下的消息是否有未消耗的情况等等情况目前阶段的应用仅限于此

最后关闭服务:sudo rabbitmqctl stop

全部评论 (0)

还没有任何评论哟~