RabbitMQ学习笔记

之前用GO写过RabbitMQ相关的服务,已经装了RabbitMQ和Erlang,跳过安装步骤。

(记得当时用go写的时候没这么麻烦呀,像什么Exchanges、Queues之类的概念我都不知道,写出来了也能跑通)

Erlang配置系统环境变量

Path中新增%ERLANG_HOME%\bin

系统变量中新增D:\programfiles\Erlang OTP(改为自己的Erlang安装地址)

cmd测试配置成功

启动RabbitMQ服务

rabbitmq-plugins enable rabbitmq_management启用管理插件用户界面
rabbitmq-server start启动服务

http://localhost:15672/进入用户界面

默认账号密码都是guest(guest:guest)

查看所有用户

bash 复制代码
server.port=8080
#这几个是默认配置。 不配也行。
#spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.rabbitmq.addresses=42.192.145.166
spring.rabbitmq.virtual-host=/

#spring.rabbitmq.addresses=172.16.48.10:5672,172.16.48.11:5672,172.16.48.12:5672

生产者

java 复制代码
@CrossOrigin
@RestController
@RequestMapping("/api/chat")
public class ChatController {
    @Resource
    private RabbitTemplate rabbitTemplate;
    
    @GetMapping(value="/send")
    public int helloWorldSend() throws UnsupportedEncodingException {

//      队列名称
        String queueName = "chat";
//      消息
        String message = "你好啊, rabbitmq!";
        rabbitTemplate.convertAndSend(queueName,message);
        return 1;
    }
}

消费者

bash 复制代码
@Component
public class Consumer {

    // 获取那个消息队列    消息队列的名称
    @RabbitListener(queues = "chat")
    public  void  listenSimpleQueueMessage(String message) {
//
        System.out.println("spring 消费者接收到的消息是:"+message);
    }

}

也可以直接将生产者和消费者写在一个Controller中

java 复制代码
@CrossOrigin
@RestController
@RequestMapping("/api/chat")
public class ChatController {
    @Resource
    private RabbitTemplate rabbitTemplate;

    @GetMapping(value="/send")
    public int Send() {
        // 队列名称
        String queueName = "chat";
        for (int i = 0; i < 10; i++) {
            // 生产者发送消息
            rabbitTemplate.convertAndSend(queueName, "spring boot 发送消息" + i);
        }
        return 1;
    }
    // 消费者
    @RabbitListener(queues = "chat")
    public  void  listenSimpleQueueMessage(String message) {
        System.out.println("spring 消费者接收到的消息是:"+message);
        // 暂停1秒
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

此时报错Failed to declare queue(s):[chat]

原因是消费者监听的队列还没有被创造,需要先手动新建一个队列。

先在Test中创建消息队列(在此之前把消费者注释掉)

java 复制代码
   @Test
    public void testSendMessage() throws IOException, TimeoutException {
        // 1.建立连接
        ConnectionFactory factory = new ConnectionFactory();
        // 1.1.设置连接参数,分别是:主机名、端口号、vhost、用户名、密码
        factory.setHost("localhost");
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("guest");
        factory.setPassword("guest");
        // 1.2.建立连接
        Connection connection = factory.newConnection();

        // 2.创建通道Channel
        Channel channel = connection.createChannel();

        // 3.创建队列
        String queueName = "chat";
        channel.queueDeclare(queueName, false, false, false, null);

        // 4.发送消息
        String message = "hello, rabbitmq!";
        channel.basicPublish("", queueName, null, message.getBytes());
        System.out.println("发送消息成功:【" + message + "】");

        // 5.关闭通道和连接
        channel.close();
        connection.close();
    }
}

输出

一些尝试

RabbitMQ tutorial - Remote procedure call (RPC)

通过spring提供的一个RabbitTemplate对象中sendAndReceiverabbitTemplate.sendAndReceive方法来实现,这个方法是发送消息然后一直等待响应。监听器里面实现的和之前的逻辑大致相同,都需要将response响应消息发送到对应的replyTo回调队列上。(这跟远程方法调用有什么关系?)

我感觉在我想实现RPC的功能不太一样。

最终还是用自己写的一个简单的RPC来实现远程方法调用。

RPC消费者将远程调用的函数名和函数参数通过http发送给服务提供者。RPC服务提供者通过Tomcat接收远程方法调用,处理后将结果返回给调用者。

RPC消费者(也就是主要业务代码)的Controller层接收消息后将其绑定一个ID放入RabbitMQ中,并将ID返回给用户,告诉用户收到请求,正在处理。用户通过ID不断请求实际处理后的结果。同时RabbitMQ的消费者(也属于RPC消费者代码中)从RabbitMQ中获取请求,通过RPC向远程方法调用的服务提供者发送请求,收到返回结果后,将结果存入数据库,再从RabbitMQ中拉取下一条请求。

保证RPC服务提供者同一时刻只会处理一条消息,防止请求消息丢失。

相关推荐
循环过三天3 分钟前
3-1 PID算法改进(积分部分)
笔记·stm32·单片机·学习·算法·pid
生如夏花℡27 分钟前
HarmonyOS学习记录3
学习·ubuntu·harmonyos
之歆30 分钟前
Python-封装和解构-set及操作-字典及操作-解析式生成器-内建函数迭代器-学习笔记
笔记·python·学习
幽络源小助理36 分钟前
SpringBoot基于JavaWeb的城乡居民基本医疗信息管理系统
java·spring boot·学习
虾球xz2 小时前
CppCon 2018 学习:EFFECTIVE REPLACEMENT OF DYNAMIC POLYMORPHISM WITH std::variant
开发语言·c++·学习
Chef_Chen2 小时前
从0开始学习R语言--Day38--辛普森多样性指数
学习
Allen_LVyingbo2 小时前
Python常用医疗AI库以及案例解析(2025年版、上)
开发语言·人工智能·python·学习·健康医疗
DKPT2 小时前
Java组合模式实现方式与测试方法
java·笔记·学习·设计模式·组合模式
受之以蒙2 小时前
Rust & WASM 之 wasm-bindgen 基础:让 Rust 与 JavaScript 无缝对话
前端·笔记·rust
茫忙然3 小时前
【WEB】Polar靶场 6-10题 详细笔记
笔记