RabbitMQ-Client源码分析(接收)

783 阅读1分钟

问题:

整合Springboot + RbabitMq。
并深入理解。

原理:

    创建连接的时候。初始化了线程。
    线程中死循环获取数据,并调用回调方法。

文档:

rabbit的中文文档: http://rabbitmq.mr-ping.com/AMQP/AMQP_0-9-1_Model_Explained.html
Springboot整合Rabbit的源码分析: https://blog.csdn.net/hry2015/article/details/79597281

步骤:

    1. 获取连接,通道等
    2. 设置消费者回调
1. 获取连接,通道等
    看上一篇文章。 发送者
    地址:  https://juejin.cn/post/6844904085477392397
2. 设置消费者回调
        String queueName = "dripy-Queue";
        Consumer consumer = new DefaultConsumer(channel) {

            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                // 这个是和我们在productor中获取的是一样的
                long deliveryTag = envelope.getDeliveryTag();
                String msg = new String(body, "utf-8");
                System.out.println("收到了消息,不代表应答了:" + msg);
                
                // 1、成功应答
                // channel.basicAck(deliveryTag, false);
            }
        };
        // true 表示自动应答,
        // false表示必须要手动应答(回调里面必须调用channel.basicAck才算完整,防止数据丢失)
        channel.basicConsume(queueName, true, consumer);
1. 定义了一个回调方法
2. 监听指定队列,并设置回调方法。
源码分析
    1.channel.basicConsume(queueName, true, consumer);

    2.分析哪里获取到这个回调。
    通过一步步向上分析,得到下面的调用链。
    newConnection->start->initialize->startMainLoop
    MainLoop.run->
    Frame.readFrame->
    handleFrame.handleFrame -> handleCompleteInboundCommand
    RecoveryAwareChannelN.processDelivery -> processDelivery  
    
    发现了是在创建连接的时候,创建了一个线程,死循环在获取rabbit里面的数据。
    然后调用对应的回调方法。