zoukankan      html  css  js  c++  java
  • 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类,但是原理相似

  • 相关阅读:
    Sql 行转换列(列转换行), JavaScript解决思路
    c# 异步线程
    C# 读取数据库存储过程返回值 笔记
    利用UtilityLibrary.dll WeifenLuo.WinFormsUI.Docking.dll控件创建工具栏效果
    关于C#Winform线程调用窗体的使用方法以及窗体的单一显示
    通过调用API函数实现的无边框窗体的拖拽,比判断坐标更快捷
    ubuntu下安装redis
    ubuntu下安装beanstalkd
    preg_match_all 执行一个全局正则表达式匹配
    mongodb的安装和进入
  • 原文地址:https://www.cnblogs.com/eternal-heathens/p/13603601.html
Copyright © 2011-2022 走看看