SpringBoot管理RabbitMQ中的Channel详解

 更新时间:2023年08月29日 08:44:50   作者:Abstracted  
这篇文章主要介绍了SpringBoot管理RabbitMQ中的Channel详解,channel仅存在于connection的上下文中,而不会单独存在,当channel关闭时,其上的所有channel也会关闭,需要的朋友可以参考下

Channel是什么

RabbitMQ是AMQP0-9-1协议的实现,先来看看AMQP0-9-1协议中对通道Channel的阐述。

有些应用程序需要与broker建立多个连接。但是,保持多个TCP连接同时打开是不可取的,因为这样做会消耗系统资源,使配置防火墙更加困难。AMQP0-9-1的Connection可以多路复用,Channel可以被认为是“共享一个TCP连接的轻量级连接”。

客户端执行的每个协议操作都发生在一个channel上。在特定channel上的通信与在另一个channel上的通信完全独立,因此每个协议方法也都带有信道ID(a.k.a)。一个整数,代理和客户端都使用它来确定该方法用于哪个通道。

channel仅存在于connection的上下文中,而不会单独存在。当channel关闭时,其上的所有channel也会关闭。

对于使用多个线程/进程进行处理的应用程序,为每个线程/进程打开一个新channel而不在它们之间共享channel是很常见的。

在普通的JAVAEE项目中,经常采用1个进程-1个connection-1个channel。

但是这在JAVAWEB场景中实不可取的。

一个web项目仅有1个进程,会有非常多的线程,每个线程都创建一个connection是不可取的。

在AMQP-0-9-1协议中推荐了使用每个线程使用一个独立的channel,这样不同线程之间的channel相互独立,并且公用同一个connection。

但是问题又来了,在并发情况下,web场景下,用户的每一次http请求都是一个线程,难道这样的每一个http请求都要对应创建一个channel吗?

Spring在集成RabbitMQ时对这个问题有了非常好的解决。

Spring如何管理Channel?

springboot使用了RabbitMQ中的IO多路复用的理念,并对这种方案在web场景下进行了优化,尽可能的复用空闲中的channel。

boot默认使用 CachingConnectionFactory 对 Connection 和空闲 Channel 进行缓存。

看看Spring中的RabbitMQ是如何工作的:

Spring中对RabbitMQ的消息操作都是通过一个Template模板对象 RabbitTemplate ,该对象中封装了对消息的接受和发送的各种重载方法。

消息的send都需要调用一个核心私有方法 doExcute() 。

在这里插入图片描述

管理RabbitMQ中的事务Channel

Spring也是通过 TransactionSupport 进行管理RabbitMQ中的事务Channel。

这一点和MyBatis的 SqlSessionTemplate 管理开启事务的 SqlSession 的步骤相同。

这里不多赘述如果管理事务的channel

1.当第一次有请求连接rabbitmq时,spring创建一个AMQP的connection,并使用CachingConnectionFactory将其封装并缓存起来。

在这里插入图片描述

2.然后使用这个connection,创建channel,当channel的任务执行完成后(也就是逻辑close时,并非真正的关闭了channel,而是在内存中给channel创建了一个标记。)

则使用 CachingConnectionFactory 的静态子类 ChannelConnectionFactoryProxy 把这个channel缓存到一个空闲列表中。开启了事务的channel存放在不同的列表中。

在这里插入图片描述

3.其他线程执行任务时,CachingConnectionFactory中获取connection,然后创建channel时,会去ChannelConnectionFactoryProxy的空闲列表中寻找哪些channel是open状态。

然后将寻找到的一个channel移出列表,并使用这个channel执行任务。(取出缓存中的channel这一过程是同步代码块, 开启了事务的channel存放在不同的列表中。)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4.任务执行完毕,将channel在缓存入空闲列表中。默认最多缓存25个channel

在这里插入图片描述

在这里插入图片描述

到此这篇关于SpringBoot管理RabbitMQ中的Channel详解的文章就介绍到这了,更多相关SpringBoot管理Channel内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 关于Java使用Http轻量级请求库Unirest的方法

    关于Java使用Http轻量级请求库Unirest的方法

    这篇文章主要介绍了关于Java使用Http轻量级请求库Unirest的方法,Unirest 是一个轻量级的 HTTP 请求库,可发起 GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS 请求,支持 Node、Ruby、Java、PHP、Python、Objective-C、.NET 等多种语言,需要的朋友可以参考下
    2023-08-08
  • Java spring MVC环境中实现WebSocket的示例代码

    Java spring MVC环境中实现WebSocket的示例代码

    这篇文章主要介绍了Java spring MVC环境中实现WebSocket,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • 利用java批量给pdf加水印的方法示例

    利用java批量给pdf加水印的方法示例

    这篇文章主要介绍了利用java批量给pdf加水印的方法,文中给出了简单的示例代码,需要的朋友可以参考借鉴,下面来一起看吧。
    2017-03-03
  • 快速了解JAVA垃圾回收机制

    快速了解JAVA垃圾回收机制

    这篇文章主要介绍了有关Java垃圾回收机制的知识,文中实例简单易懂,方便大家更好的学习,有兴趣的朋友可以了解下
    2020-06-06
  • Java中的字符串用法小结

    Java中的字符串用法小结

    这篇文章主要介绍了Java中的字符串用法,实例总结了java中关于字符串操作的各种常用的技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • SpringBoot中操作Redis及工具类的封装详解

    SpringBoot中操作Redis及工具类的封装详解

    在我们项目开发中总是免不了会使用缓存,Redis现在基本是我们公司中非常常见的缓存方案,包括在用户token的缓存,热点信息的缓存等,这篇文章主要讲讲在SpringBoot项目中如何去操作Redis,及最后工具类的封装
    2023-05-05
  • 判断二叉树是否为完全二叉树的实例

    判断二叉树是否为完全二叉树的实例

    这篇文章主要介绍了判断二叉树是否为完全二叉树的实例的相关资料,需要的朋友可以参考下
    2017-05-05
  • 详解Java的MyBatis框架中SQL语句映射部分的编写

    详解Java的MyBatis框架中SQL语句映射部分的编写

    这篇文章主要介绍了Java的MyBatis框架中SQL语句映射部分的编写,文中分为resultMap和增删查改实现两个部分来讲解,需要的朋友可以参考下
    2016-04-04
  • SpringSecurity之SecurityContextHolder使用解读

    SpringSecurity之SecurityContextHolder使用解读

    这篇文章主要介绍了SpringSecurity之SecurityContextHolder使用解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • 解决FileWriter 写入文本不换行的问题

    解决FileWriter 写入文本不换行的问题

    这篇文章主要介绍了解决FileWriter 写入文本不换行的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07

最新评论