SpringBoot集成RabbitMQ发送接收实体类和JSON互转和自动解析

2022-06-26 38点热度 0人点赞 0条评论

SpringBoot下使用RabbitMQ发送消息,最简单或者默认的方式是发送和接受string类型的,如果你遇到要发送复杂的Java实体类,那么简单的办法就是将其序列化成JSON后发送(例如使用Jackson的ObjectMapper工具),接收方再将JSON消息反序列化成Java实体类,但是这样做显然不够优雅,要处理的重复代码很多。我们可以做配置,让程序自动完成转化这样事情。

新增相关依赖

pom.xml 下增加mq相关依赖以及fastjson的依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.amqp</groupId>
    <artifactId>spring-rabbit</artifactId>
</dependency>

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.83</version>
</dependency>

发送方使用

新增RabbitMQ相关设置,给MQ设定MessageConverter为Jackson2JsonMessageConverter,来达到自动将Java的Object转成JSON。

@Configuration
public class RabbitmqConfig {

    @Bean
    public RabbitTemplate createRabbitTemplate(ConnectionFactory connectionFactory)
    {
        RabbitTemplate rabbitTemplate = new RabbitTemplate();
        rabbitTemplate.setConnectionFactory(connectionFactory);
        rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter());
        return rabbitTemplate;
    }
}
@Autowired
RabbitTemplate rabbitTemplate;

# 用mq发送java的Object,具体使用看mq的API
rabbitTemplate.convertAndSend("some_queue_name", someMessageObject);

接收方使用

@Component
public class ReceiveConfig {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Bean
    public RabbitListenerContainerFactory<?> rabbitListenerContainerFactory(ConnectionFactory connectionFactory){
        SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory);
        factory.setMessageConverter(new Jackson2JsonMessageConverter());
        //每次处理数据数量,提高并发量
        factory.setPrefetchCount(250);
        return factory;
    }

    @RabbitListener(queues = "some_queue_name", concurrency = "1-3")
    @RabbitHandler
    public void handleCodeQueue(@Payload SomeMessageObject someMessageObject, Channel channel, Message message) throws IOException {
        long deliveryTag = message.getMessageProperties().getDeliveryTag();
        logger.info("消费的消息来⾃的队列名为:" + message.getMessageProperties().getConsumerQueue());
        // 其他代码省略
    }

}

 

admin

这个人很懒,什么都没留下

文章评论

您需要 登录 之后才可以评论