Spring 中 @RabbitListener 背后的交互流程

在 Spring 框架中使用 @RabbitListener时,其背后与 RMQ 服务的交互流程如下:

  1. 连接建立:
    当应用启动时,Spring AMQP 自动配置(Auto Configuration)机制会根据配置创建一个连接工厂(Connection Factory),并与 RabbitMQ 服务器建立连接。从 RMQ 服务的视角看,就是建立了一个 Connection

  2. 注册消费者&订阅

  • Spring 应用启动时,扫描带有 @RabbitListener 注解的方法;
  • Spring AMQP 为每个注解的方法注册一个或多个消费者(默认 1 个,可以通过注解的 concurrency参数配置多个消费者);
  • SimpleMessageListenerContainer 在内部创建相应数量的消费者线程;
  • 这些消费者线程在启动时,会从 ConnectionFactory 获取 Channel,通过 Channel 向 RabbitMQ 服务发送 Basic Consume 命令,这一操作告诉 RabbitMQ 服务,这些消费者线程订阅了指定的队列,并准备接收消息;
  • 此时 RabbitMQ 服务视角正式得知这些消费者的存在,每个消费者对应一个 Channel
  1. 消息获取(Message Fetching):
  • RabbitMQ 将消息推送(push)给消费者,消费者通过 basicDeliver方法接收消息。这是一个被动的过程,消费者等待消息被推送,而不是主动拉取。

basicDeliver方法是 RabbitMQ 客户端库(如 Java 中的 amqp-client 库)用来处理服务器推送消息的一个回调方法。

  1. 消息处理:
    一旦消息被推送到消费者,Spring 最终会调用相应的 @RabbitListener 注解的方法来处理消息,例如:
@RabbitListener(queues = "yourQueueName")
public void handleMessage(String message) {
    // 处理消息的逻辑
    System.out.println("Received message: " + message);
}

Spring AMQP 框架实现了一个 ChannelAwareMessageListener,它内部处理 basicDeliver 方法,并将消息传递给相应的 @RabbitListener 注解的方法。

在默认的自动确认模式下(auto-acknowledge),Spring 会在 @RabbitListener 方法成功返回后自动确认消息。

你可能会困惑:诶?RMQ 的自动确认模式不是不需要客户端返回 ACK 吗?
注意:这里说的自动确认模式,指的是 Spring 框架定义的确认模式(参考:org.springframework.amqp.core.AcknowledgeMode 枚举类),需要将其与 RMQ 的 ACK 模式进行区分。
Spring 中确认模式的自动确认(AUTO)对应到 RMQ 的 ACK 模式其实是手工确认模式(Manual Ack),只是 Spring 框架会在 @RabbitListener 方法成功返回后自动调用 ACK 方法给 RMQ 服务发送消息确认。
RMQ ACK 模式 中的 Auto Ack 对应到 Spring 框架的确认模式是 NONE —— 无需确认。
更多关于消息确认模式的内容,可以阅读:RMQ 的 autoACK 自动消息确认是什么?

如果配置了手动确认模式,开发者需要显式地调用确认方法,如 basicAckbasicNack

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容