Redis是否兼容JMS?替换ActiveMQ作为JMS Broker报错咨询
先直接给你结论:Redis本身并不兼容JMS协议,这就是你把spring.activemq.broker-url改成tcp://localhost:6379后出现协议握手错误的核心原因。ActiveMQ是JMS规范的实现,用的是OpenWire这类JMS专属协议,而Redis有自己的RESP协议,两者完全不互通,直接替换代理地址肯定跑不起来。
关于能不能把Redis用作JMS消息的缓存,答案是可以,但不能直接把它当JMS代理用,得换几种思路来实现:
让JMS代理用Redis做持久化存储
比如ActiveMQ本身支持将Redis作为消息的持久化后端。你不需要替换ActiveMQ的broker-url,而是修改ActiveMQ的配置,让它把消息存在Redis里——这样既保留了JMS的API和规范,又能利用Redis的缓存性能来存储消息。脱离JMS规范,直接用Redis的消息能力
Redis本身提供了Pub/Sub发布订阅功能,还有Stream数据结构能实现带持久化的消息队列。如果你的业务代码可以调整,不依赖JMS的API,直接用Spring Data Redis来实现消息收发,这是最直接的方式,完全不需要JMS代理。用Spring Cloud Stream做抽象层
Spring Cloud Stream提供了统一的消息编程模型,支持Redis作为绑定器。你可以用类似JMS的写法来处理消息,底层却由Redis来支撑,这样既能复用现有类似JMS的业务逻辑,又避开了JMS协议不兼容的问题。举个简单的配置例子:# 配置输入输出绑定的主题 spring.cloud.stream.bindings.input.destination=my-message-topic spring.cloud.stream.bindings.output.destination=my-message-topic # 指定Redis绑定器的地址 spring.cloud.stream.redis.binder.redis-nodes=localhost:6379
最后再提醒一句:别再尝试把Redis直接当成JMS代理来配置了,协议层面根本不兼容,怎么调都会报错。选上面的一种方案适配,才是正确的方向。
内容的提问来源于stack exchange,提问作者Chenxi

