springboot整合RabbitMQ

2. RabbitTemplate原理

Publisher借助rabbitTemplate进行消息添加接收,rabbitTemplate使用connection和channel(若是在事务支持的情况下,为了节约TCP资源,会用RabbitResourceHolder保存connection和其上面的channelList的关系在其中,之后相同的),通过各种方法最后通过execute方法执行,该方法中若是存在重试模板(retryTemplate,失败会进行重试)则用retryTemplate的execute方法进行获取连接最后还是会调用rabbitTemplate的doExecute

而rabbitTemplate中的connection的创建由connectionFactory(会经过ConnectionFactoryUtils,其主要作用是会在有事务支持的时候进行资源获取和绑定)进行创建,而connectionFactory创建的connection是实现了com.rabbitmq.client.Connection(即导入jar中的Connection)接口的AMQConnection(其start方法才是真正连接RabbitServer的)

而我们还会从AMQConnection中创建channenl,每个channel都会绑定绑定唯一一个connection,而每个channel创建时都是由AMQConnection中的ChannelManager管理(channel对connection是多对一的关系)

而ChannelManager只有在connectionFactory(由connection包的connectionFactory调用client包的connectionFactory)创建了AMQConnection(创建后会调用Connection的start方法,会创建初始化ChannelManager,才能往其中创建新的或添加channnel)后才能使用.

template调用invokeAction来实现操作,为传入的channel添加监视器,最后由ChannelCallback.doInRabbit(channel)实现,该接口没有实现类,该接口的实现全由lambda表达式实现,使得能先执行execute方法获得connection和channel后能直接回调实现lambda表达式,使得不用在为相同参数的方法起不同的方法名或者复杂的条件判断实现。简化匿名内部类。

只要访问成功没有异常,最后都会执行doInRabbit,返回rabbitTemplate用获取的connection和channel通过Message通信,message会被解读,最后信息放在AMQCommand中,获取channel中的connection将commnd中的信息提取转换为Stream调用flush方法输出到Buffer中(实现flushable接口的将被动态代理由代理类实现),由其他设备读取传送,并由metricsCollector做资源收集,查看发布情况等

虽然不像Cache有专门的Client类,但是原理相似

原文地址:https://www.cnblogs.com/eternal-heathens/p/13603601.html