将来自RabbitMQ的消息转换为字符串/JSON

9

我目前正在努力解决一个相对简单的问题。我想从RabbitMQ接收一条消息,并将其转换为字符串(或稍后转换为JSON对象)。但是我得到的都是字节。

Message对象以这种方式显示为字符串

(Body:'{"cityId":644}'; ID:null; Content:application/json; Headers:{}; Exchange:; RoutingKey:pages.type.index; Reply:null; DeliveryMode:NON_PERSISTENT; DeliveryTag:1)

配置类(使用Spring)

@Configuration
public class RabbitConfiguration {

    @Bean
    public CachingConnectionFactory connectionFactory() {
        CachingConnectionFactory connectionFactory = new CachingConnectionFactory("www.example.com");
        connectionFactory.setUsername("xxxx");
        connectionFactory.setPassword("xxxx");
        return connectionFactory;
    }

    @Bean
    public MessageConverter jsonMessageConverter(){
        JsonMessageConverter jsonMessageConverter = new JsonMessageConverter();
        return jsonMessageConverter;
    }

    @Bean
    public SimpleMessageListenerContainer messageListenerContainer(){
        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory());
        container.setAutoStartup(false);
        container.setQueues(indexQueue());
        container.setConcurrentConsumers(1);
        container.setAcknowledgeMode(AcknowledgeMode.AUTO);
        container.setMessageListener(new MessageListenerAdapter(pageListener(), jsonMessageConverter()));
        return container;
    }

    @Bean
    public Queue indexQueue(){
        return new Queue("pages.type.index");
    }

    @Bean
    public MessageListener pageListener(){
        return new PageQueueListener();
    }

}

以及消息监听器

public class PageQueueListener implements MessageListener {

    public void onMessage(Message message) {
        System.out.println(message);
        System.out.println(message.getBody());
    }
 }

我的问题是,getBody() 方法显示为 [B@4dbb73b0,所以没有任何转换。无论是字符串还是JSON对象都没有转换成功 :(

我感到很愚蠢,但我找不到解决方法

2个回答

21

message.getBody() 返回一个 byte[]

尝试:

byte[] body = message.getBody();
System.out.println(new String(body));

4
你要开玩笑吧……那个起作用了,但是MessageConverter呢?它没起到任何作用吗? - MatthiasLaug
3
如果您查看org.springframework.amqp.core.Message的源代码,您会发现一个方法名为private String getBodyContentAsString(),它是这样实现的:return new String(body, ENCODING); ... 因此,这种写法也应该可以:System.out.println(new String(message.getBody(), Charset.defaultCharset().name())) - pulkitsinghal
我正在使用getBody()方法,但正好在new String的那一行出现了内存溢出异常。实际上,在长时间运行后,它会失败并抛出异常。你有什么建议来解决这个问题吗? - Amin Heydari Alashti

1

如果您想解析为JSONObject,最好的方法是将RabbitMQ消息以String格式添加到StringBuilder中。然后使用任何转换工具将StringBuilder解析为JSONObject。
例如:

StringBuilder sb = new StringBuilder();
sb.append(publisher.toString());
payload = (JSONObject)jsonParser.parse(sb.toString());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接