Spring Integration Redis适配器通过RedisConnectionFactory实现消息收发:inbound需配置message-converter(如MappingJackson2MessageConverter)和channel-type(queue/topic),outbound需匹配payload类型与command(lpush/publish)并统一序列化协议,避免跨服务读写异常。

Spring Integration 的 Redis 入站(inbound)和出站(outbound)通道适配器,本质是把 Redis 当作消息中间件来用:入站监听 Redis 队列(如 List 或 Pub/Sub),出站往队列推消息。它不走 RedisTemplate,而是依赖 RedisConnectionFactory + 专用的适配器组件,配置稍显隐蔽,容易漏掉关键点。
Redis inbound-channel-adapter 必须指定 message-converter 和 channel-type
入站适配器默认只读取原始字节,不自动反序列化;如果你往 Redis 里存的是 JSON 字符串,但没配 message-converter,收到的就是 byte[],后续无法直接 cast 成业务对象。
-
redis:inbound-channel-adapter必须配合redis:message-converter使用,推荐用MappingJackson2MessageConverter(需在 classpath 有jackson-databind) - 必须显式设置
channel-type="queue"或channel-type="topic",否则默认行为不确定——queue对应 BLPOP 拉取 List,topic对应 SUBSCRIBE 监听 Pub/Sub - 若用
queue模式,要确保生产端用LPUSH或RPUSH写入,且 key 名与适配器的queue属性一致
redis:outbound-channel-adapter 的 payload 类型决定写入方式
出站适配器不会帮你做类型转换,它直接把 payload 丢进 Redis。如果 payload 是字符串,就按字符串写;如果是 Map,会尝试序列化——但默认序列化器是 JdkSerializationRedisSerializer,跨服务不可读。
- 写入 List(队列):设
command="lpush"或"rpush",key-expression="@settings.queueKey" - 写入 Pub/Sub:设
command="publish",channel-expression="'my-topic'" - 务必搭配
redis:message-converter,否则非 String payload 可能写入失败或乱码
连接工厂复用要注意线程安全和序列化一致性
Spring Integration Redis 适配器和 RedisTemplate 可以共用同一个 RedisConnectionFactory,但二者序列化策略互不影响——适配器用的是自己绑定的 message-converter,RedisTemplate 用的是自己的 valueSerializer。混用时容易出现“一个服务能读,另一个读不了”的情况。
- 不要让
RedisTemplate和 inbound/outbound 适配器共享同一套序列化器,除非你明确控制了两端都用StringRedisSerializer或统一 JSON 序列化 - Lettuce 连接工厂是线程安全的,可放心复用;Jedis 工厂不是,不建议在适配器中使用 Jedis
- 如果项目同时用了 Spring Integration Redis 和 Spring Data Redis 的事务(
SessionCallback),注意 Lettuce 的连接是异步非阻塞的,事务语义与传统 JDBC 不同,WATCH/MULTI/EXEC需手动封装
真正难调的不是配置语法,而是两端序列化协议对齐——比如前端用 Jackson 写入 JSON,后端 inbound 适配器却用了 JDK 序列化去读,错误日志里只报 ClassNotFoundException 或空 payload,根本看不出是序列化问题。


















