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类,但是原理相似

  • 相关阅读:
    解决Maven项目pom.xml文件报xxx argetclassesMETA-INFMANIFEST.MF (系统找不到指定的路径。)问题
    MYSQL安装时解决要输入current root password的解决方法
    [多图]Windows 10 Build 10565今推送:优化界面菜单 Cortana改进
    Windows Server 2016 预览版下载
    编程书籍推荐——按角色划分
    编程书籍推荐——按内容划分
    无线路由器一、二、三根天线有什么区别?
    thinkphp5 下 的Nginx 伪静态
    linux 下执行python.py 无效解决方案
    Python Qt5 Creator 使用创建项目教程
  • 原文地址:https://www.cnblogs.com/eternal-heathens/p/13603601.html
Copyright © 2011-2022 走看看