讲师中心 微信公众号
AI工具推荐 视频效率加速

在Spring Boot 3中如何配置Lettuce监听Redis发布订阅

冬芳小哥_9294

冬芳小哥_9294

发布时间:2026-09-07 06:33:30

|

598人浏览过

|

来源于php中文网

原创

Spring Boot 3 默认不自动配置RedisMessageListenerContainer,必须手动声明Bean并显式设置ConnectionFactory、TaskExecutor、addMessageListener及setAutoStartup(true),否则监听器不启动且无日志。

在spring boot 3中如何配置lettuce监听redis发布订阅

Spring Boot 3 默认使用 Lettuce 作为 Redis 客户端,发布订阅配置必须显式启用监听容器,且不能依赖自动装配的 RedisMessageListenerContainer —— 它不会自动创建,必须手动声明 Bean。

为什么 RedisMessageListenerContainer 不自动生效

Spring Boot 3 移除了对 RedisMessageListenerContainer 的自动配置支持(spring-boot-starter-data-redis 不再触发 @EnableRedisHttpSession 或监听器容器初始化)。即使你写了 @Configuration 类,若没显式注册 RedisMessageListenerContainer Bean,监听器永远不会启动。

  • 现象:onMessage 方法从不被调用,日志无任何订阅记录,redis-cli SUBSCRIBE xxx 却能收到消息 → 说明 Redis 服务正常,但 Spring 侧未建立监听连接
  • 根本原因:Lettuce 的连接是基于事件循环(EventLoop)的,RedisMessageListenerContainer 需要绑定到一个活跃的 RedisConnectionFactory 并主动调用 start();Spring Boot 3 不再代劳
  • 关键点:必须确保 RedisConnectionFactory 是 Lettuce 类型(非 Jedis),且已正确配置连接池与线程模型

如何正确声明 RedisMessageListenerContainer Bean

手动构建容器时,需显式设置连接工厂、线程执行器(否则默认用同步单线程,会阻塞)、并注册监听器适配器与 Topic。不要复用 StringRedisTemplate 的序列化器,发布订阅默认走字节流,推荐统一用 StringRedisTemplateconnectionFactoryvalueSerializer

Spring Boot 3.3.13
Spring Boot 3.3.13

Spring Boot下载页提供 3.3.13 官方源码 ZIP,并整理快速入门、项目创建、配置和自动配置说明。

下载
  • 必须调用 container.setTaskExecutor(...),否则消息回调会在主线程(如 Web 请求线程)中执行,极易引发超时或阻塞
  • Topic 类型优先选 PatternTopic(支持通配符匹配,如 "user:*),而非 ChannelTopic(仅精确匹配);两者不可混用在同一个容器中
  • MessageListenerAdapter 构造时,第二个参数必须是接收方法名(字符串),该方法签名必须为 void method(Message, byte[])void method(String)(后者需开启 serializer 自动转换)
  • 示例片段:
@Bean
public RedisMessageListenerContainer redisMessageListenerContainer(
        RedisConnectionFactory connectionFactory,
        MessageListenerAdapter messageListenerAdapter) {
    RedisMessageListenerContainer container = new RedisMessageListenerContainer();
    container.setConnectionFactory(connectionFactory);
    container.setTaskExecutor(new ThreadPoolTaskExecutor() {{
        setCorePoolSize(4);
        setMaxPoolSize(8);
        setQueueCapacity(100);
        setThreadNamePrefix("redis-listener-");
    }});
    container.addMessageListener(messageListenerAdapter, new PatternTopic("event:*"));
    return container;
}

Lettuce 连接工厂的配置陷阱

Spring Boot 3 中 RedisConnectionFactory 默认由 LettuceClientConfigurationBuilderCustomizer 管理,但监听场景下容易忽略两个关键定制点:

  • setShareNativeConnection(false):必须设为 false,否则 Lettuce 复用连接会导致订阅通道被意外关闭或消息丢失
  • ClientOptions.builder().publishOnScheduler(true):若监听高吞吐消息,建议启用调度器,避免 Netty EventLoop 被阻塞
  • 连接池配置中,max-active 建议 ≥ 监听器数量 + 1(至少留一个连接给发布者),否则可能因连接争抢导致订阅延迟
  • YAML 示例(注意路径是 spring.data.redis.lettuce,不是旧版 spring.redis.lettuce):
spring:
  data:
    redis:
      host: localhost
      port: 6379
      lettuce:
        pool:
          max-active: 12
          max-idle: 8
        client-options:
          publish-on-scheduler: true

监听器方法反序列化失败怎么办

默认 Message.getBody() 是原始字节数组,若你用 StringRedisTemplate.convertAndSend() 发布 JSON 字符串,监听器里直接 new String(msg.getBody()) 可能乱码或失败 —— 因为 Lettuce 默认未指定字符集,且未处理空值/二进制边界。

  • 安全做法:在 MessageListenerAdapter 初始化时传入 StringRedisTemplate.getValueSerializer(),让框架自动转成 String
  • 更健壮方式:监听器方法签名为 void onEvent(String message),并在 @Bean MessageListenerAdapter 中指定 setSerializer(stringRedisTemplate.getValueSerializer())
  • 若发布的是自定义对象(如 LoginSuccessMessage),必须确保监听器和发布者使用完全相同的 RedisTemplate<String, T> 实例,且序列化器一致(如 Jackson2JsonRedisSerializer
  • 错误典型:Cannot construct instance of `xxx` (no Creators, like default constructor, exist) → 检查 DTO 是否有无参构造、字段是否 public 或有 getter/setter

真正容易被忽略的是:Lettuce 的订阅连接是长生命周期的,一旦容器启动后,它会持续保活;但若 Redis 服务重启或网络闪断,RedisMessageListenerContainer 默认不会自动重连订阅 —— 你需要自己监听 ConnectionFailureEvent 或引入重试逻辑。这不是配置问题,而是生产环境必须面对的可靠性缺口。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

2071

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

377

2026.01.26

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

3969

2023.11.02

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

3435

2023.11.14

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

6092

2024.04.02

redis怎么做缓存服务器
redis怎么做缓存服务器

redis 作为缓存服务器的答案:redis 是一款开源、高性能、分布式的键值存储,可作为缓存服务器使用。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

583

2024.04.07

redis怎么解决数据一致性
redis怎么解决数据一致性

redis 提供了两种一致性模型,以维护副本数据一致性:强一致性 (sync) 确保写操作仅在复制到所有从节点后才完成;最终一致性 (async) 则在主节点上写操作后认为已完成,牺牲一致性换取性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

696

2024.04.07

mysql和redis怎么保证双写一致性
mysql和redis怎么保证双写一致性

确保 mysql 和 redis 双写一致性的技术包括:1、事务性更新:同时更新 mysql 和 redis,保证一致性;2、主从复制:mysql 主服务器更改同步到 redis 从服务器;3、基于事件的更新:mysql 记录更改并发送到 redis等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

5442

2024.04.07

AI视频生成软件推荐
AI视频生成软件推荐

本专题汇总了当前主流的AI视频生成软件推荐与排行榜单,涵盖seko、AniShort、剧云、Lovart、LiblibAI及立刻mv等热门工具。同时整理了各软件在文生视频、图生视频、时长限制、画质表现及免费额度等方面的差异对比,助您快速选对适合创作需求的AI视频生成工具。

140

2026.09.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn