【问题标题】:Converting Message from RabbitMQ into string/json将消息从 RabbitMQ 转换为字符串/json
【发布时间】:2012-10-05 14:19:26
【问题描述】:

我目前正在努力解决一个相当简单的问题。我想从 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 对象:(

我觉得自己很愚蠢,但我在这里找不到解决方案

【问题讨论】:

    标签: java json spring rabbitmq amqp


    【解决方案1】:

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

    试试:

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

    【讨论】:

    • 你是在跟我开玩笑……这行得通,但是 MessageConverter 怎么样,这没有任何作用吗?
    • 此外,如果您查看 org.springframework.amqp.core.Message 的源代码,您会发现带有签名 private String getBodyContentAsString() 的方法是这样的:return new String(body, ENCODING); ...因此这也应该足够了: System.out.println(new String(message.getBody(), Charset.defaultCharset().name()))
    • 我正在使用 getBody() 方法,但它恰好在新字符串行导致内存不足异常。实际上,经过长时间的运行,它失败了,但异常。你有什么建议可以解决这个问题吗?
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-15
      • 1970-01-01
      • 2018-06-28
      相关资源
      最近更新 更多