问题:
整合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里面的数据。
然后调用对应的回调方法。