Spring JMS集成RabbitMQ控制台手动发消息报invalid stream header错误如何解决
问题原因
报错是因为rabbitmq-jms默认会把消息体当做Java序列化后的字节流解析,你在RabbitMQ控制台手动发送的是普通文本,没有Java序列化的固定流头,所以触发StreamCorruptedException异常。
方案1:不修改代码,仅在RabbitMQ控制台发布消息时添加指定头
你在控制台发布消息的「Headers」区域新增以下两个属性即可:
content_type:值填text/plaintype:值填TextMessage
消息体直接填写普通字符串即可被正常消费。
方案2:修改JMS配置,默认使用字符串消息转换器,兼容所有文本消息
该方案不需要每次在控制台手动加头,应用本身的消息收发逻辑也不受影响,修改配置类如下:
@EnableJms @Configuration public class ConnectionRabbitConfig { @Autowired RabbitProperties rabbitProperties; @Bean public ConnectionFactory jmsConnectionFactory() { RMQConnectionFactory connectionFactory = new RMQConnectionFactory(); connectionFactory.setUsername(rabbitProperties.getUser()); connectionFactory.setPassword(rabbitProperties.getPass()); connectionFactory.setVirtualHost(rabbitProperties.getVirtualhost()); connectionFactory.setHost(rabbitProperties.getHost()); connectionFactory.setPort(rabbitProperties.getPort()); return connectionFactory; } // 配置字符串消息转换器 @Bean public MessageConverter stringMessageConverter() { return new StringMessageConverter(); } @Bean public DefaultJmsListenerContainerFactory jmsListenerContainerFactory(@Autowired ConnectionFactory connectionFactory, @Autowired MessageConverter messageConverter) { DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); factory.setConnectionFactory(connectionFactory); factory.setAutoStartup(rabbitProperties.getListenerEnabled()); // 给监听容器注入消息转换器 factory.setMessageConverter(messageConverter); return factory; } @Bean public JmsTemplate defaultJmsTemplate(@Autowired ConnectionFactory connectionFactory, @Autowired MessageConverter messageConverter) { JmsTemplate jmsTemplate = new JmsTemplate(connectionFactory); // 给发送模板注入消息转换器,保证应用内发送的消息格式统一 jmsTemplate.setMessageConverter(messageConverter); return jmsTemplate; } }
修改完成后,不管是应用自身发送的消息,还是控制台手动发送的普通文本消息都可以正常消费。
内容的提问来源于stack exchange,提问作者Dilermando Lima
相关产品推荐
相关产品推荐

