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

  • 相关阅读:
    项目经理手记
    自动填写版权信息
    在批处理中实现等待/延迟/暂停
    使用 PowerDesigner 设计数据库
    如何让PowerDesigner支持自动生成含SQL Server 2000的表和列注释的角本
    管理人员的招聘始末谈
    PowerDesign 6简易介绍
    PowerDesigner11.0使用总结
    用表单字段加亮的方式为用户提供友好的界面
    择才有道——企业招聘方式比较
  • 原文地址:https://www.cnblogs.com/eternal-heathens/p/13603601.html
Copyright © 2011-2022 走看看