天天看点

RabbitMQ中各种消息类型如何处理?

消息类型

•Map•String(含json字符串类型)

处理方法

Map消息

RabbitMQ中各种消息类型如何处理?

如果发送的消息类型是map类型,可以通过SerializationUtils.deserialize方法将消息转换成map类型。

字符串类型(含json格式)

RabbitMQ中各种消息类型如何处理?

默认情况下RabbitMQ发送的消息是为字节码,有时我们需要发送JSON格式的消息,则有如下两种处理方式。

手动转换成json

@Autowired
private ObjectMapper objectMapper;


public void sendOrder(Order order) {
    try {
        String orderJson = objectMapper.writeValueAsString(order);
        Message message = MessageBuilder
                            .withBody(orderJson.getBytes())
                            .setContentType(MessageProperties.CONTENT_TYPE_JSON)
                            .build();
        this.rabbitTemplate.convertAndSend(RabbitConfig.QUEUE_ORDERS, message);
    } catch (JsonProcessingException e) {
        e.printStackTrace();
    }
}      

但是在每一个发送消息的地方都这样写就会很繁琐。

使用MessageConvert自动转换为json

如果规定了消息的格式为JSON,并使用消息转换器,则会自动将消息转化为json格式而不需要每次手动进行转换。RabbitTemplate默认使用SimpleMessageConverter作为自己的消息转化器,而SimpleMessageConverter并不能满足json消息的需求。我们可以使用Jackson2JsonMessageConverter作为默认的消息转换器。

为RabbitTemplate配置MessageConverter:

@Configuration
public class RabbitConfig {


    @Bean
    public RabbitTemplate rabbitTemplate(final ConnectionFactory connectionFactory) {
        final RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
        rabbitTemplate.setMessageConverter(jsonMessageConverter());
        return rabbitTemplate;
    }


    @Bean
    public Jackson2JsonMessageConverter jsonMessageConverter() {
        return new Jackson2JsonMessageConverter();
    }
}      

通过String类的构造函数接收byte[]类型的消息数据,获得jsonStr后可以转换成其它类,然后再进行相关操作。

这里@RabbitListener注解在方法上,如果类中有多个@RabbitListener(queues = TopicRabbitmqConfig.EVENT_MSG_QUEUE_NAME)注解的方法,测试的结果是轮流的调用。

另一种接收方式

RabbitMQ中各种消息类型如何处理?

注意,这里RabbitListener注解在类上,方法中通过@RabbitHandler注解标识。

控制台

打开 RabbitMQ web 控制台,也可以看到刚才我们在代码里面配置的交换器和队列,以及绑定信息。

RabbitMQ中各种消息类型如何处理?

查看交换器的详情

RabbitMQ中各种消息类型如何处理?

查看队列