RabbitMQ在SpringBoot中使用的一些注意点
2017-06-11 21:26
369 查看
在使用SpringBoot中,笔者使用到了RabbitMQ,其中踩了不少地雷,经过些许的刻版终于把它调通了,
笔者主要说的是从生产者生产数据并发送给消费者到后者接收并处理数据这么一个全过程,我这里的数据指的是实体对象.生产者和消费者是处在两个不同的项目中的.
首先说明下整个过程.
在 Spring-AMQP 中比较重要的类就是 Message ,因为要发送的消息必须要构造成一个 Message 对象来进行传输。Message 对象包括两部分 Body 和 Properties
消息生产者构造好 Message 之后,就会将 Message 发送到指定的 Exchange (交换机),再根据 Exchange 的类型及 routing-key 将消息路由到相应的 queue 中,最后被监听该 queue 的消费者消费.
tips:
1,当处理的数据是实体类的时候,需要特别注意,它是需要转换的,否则会抛错的.笔者指的是使用
1,生产者负责发送如右边:RabbitTemplate rabbitTemplate.convertAndSend("testDirectExchange","key1", new Teacher("whc_teacher"));
2,消费者这边有监听器,绑定好队列,交换机
4000
和路由.如下,在消费者类头配置.
@RabbitListener(
containerFactory = "simpleRabbitListenerContainerFactory",
bindings = @QueueBinding(
value = @Queue(value = "testDirectQueue1",durable = "true"),
exchange = @Exchange(value = "testDirectExchange",type = ExchangeTypes.DIRECT),
key = "key1")
)
3,最核心的我觉得是它的配置文件了,因为我们传输的是是实体对象.所以牵涉到数据的转换了.
数据转化我用的是Jackson2JsonMessageConverter,比较友好.
认证: @Qualifier(value = "classMapper") ClassMapper classMapper
传输:Jackson2JsonMessageConverter messageConverter = new Jackson2JsonMessageConverter();
需要把认证set进去,messageConverter.setClassMapper(classMapper);
其中,classMapper 这个bean里面使用的是DefaultClassMapper,它里面有放着一个map.
特别需要注意的是:Jackson2JsonMessageConverter,JsonMessageConverter 等都是比较常用的转化器,但是他们也是有局限性的,
不过使用 它们时有一个小问题,在不对它进行任何改造的前提下 ,发送消息的类和接受消息的类必须是一样的,不仅是要里面的字段一样,类名一样,连类的包路径都要一样。
绑定:也就是交换机需要和队列相绑定,这其中如上图所示,是多对多的关系.
虚拟主机:一个虚拟主机持有一组交换机、队列和绑定。为什么需要多个虚拟主机呢?很简单,_RabbitMQ当中,用户只能在虚拟主机的粒度进行权限控制
笔者主要说的是从生产者生产数据并发送给消费者到后者接收并处理数据这么一个全过程,我这里的数据指的是实体对象.生产者和消费者是处在两个不同的项目中的.
首先说明下整个过程.
在 Spring-AMQP 中比较重要的类就是 Message ,因为要发送的消息必须要构造成一个 Message 对象来进行传输。Message 对象包括两部分 Body 和 Properties
消息生产者构造好 Message 之后,就会将 Message 发送到指定的 Exchange (交换机),再根据 Exchange 的类型及 routing-key 将消息路由到相应的 queue 中,最后被监听该 queue 的消费者消费.
tips:
1,当处理的数据是实体类的时候,需要特别注意,它是需要转换的,否则会抛错的.笔者指的是使用
1,生产者负责发送如右边:RabbitTemplate rabbitTemplate.convertAndSend("testDirectExchange","key1", new Teacher("whc_teacher"));
2,消费者这边有监听器,绑定好队列,交换机
4000
和路由.如下,在消费者类头配置.
@RabbitListener(
containerFactory = "simpleRabbitListenerContainerFactory",
bindings = @QueueBinding(
value = @Queue(value = "testDirectQueue1",durable = "true"),
exchange = @Exchange(value = "testDirectExchange",type = ExchangeTypes.DIRECT),
key = "key1")
)
3,最核心的我觉得是它的配置文件了,因为我们传输的是是实体对象.所以牵涉到数据的转换了.
数据转化我用的是Jackson2JsonMessageConverter,比较友好.
认证: @Qualifier(value = "classMapper") ClassMapper classMapper
传输:Jackson2JsonMessageConverter messageConverter = new Jackson2JsonMessageConverter();
需要把认证set进去,messageConverter.setClassMapper(classMapper);
其中,classMapper 这个bean里面使用的是DefaultClassMapper,它里面有放着一个map.
特别需要注意的是:Jackson2JsonMessageConverter,JsonMessageConverter 等都是比较常用的转化器,但是他们也是有局限性的,
不过使用 它们时有一个小问题,在不对它进行任何改造的前提下 ,发送消息的类和接受消息的类必须是一样的,不仅是要里面的字段一样,类名一样,连类的包路径都要一样。
4,
交换机:_Exchange 用于转发消息,但是它不会做存储_ ,如果没有 Queue bind 到 Exchange 的话,它会直接丢弃掉 Producer 发送过来的消息。常用交换机又分为3种类型:Direct Exchange,Topic Exchange,Fanout Exchange。
绑定:也就是交换机需要和队列相绑定,这其中如上图所示,是多对多的关系.
虚拟主机:一个虚拟主机持有一组交换机、队列和绑定。为什么需要多个虚拟主机呢?很简单,_RabbitMQ当中,用户只能在虚拟主机的粒度进行权限控制
相关文章推荐
- Spring Boot中使用RabbitMQ
- Spring boot项目 使用ip+port+contextPath进行访问的时候会直接显示出项目中的一些接口信息和相关数据
- Spring Boot与RabbitMQ延迟队列使用示例
- springboot使用rabbitMQ的坑
- Spring Boot 中使用 RabbitMQ
- 004,配置文件之使用rabbitmq-env.conf,rabbitmq.config在生产环境的应用和和一些注意的问题
- CentOS7下RabbitMq及与SpringBoot集成注意点
- 如何在Spring Boot中使用RabbitMQ 你们知道吗?
- 使用eclipse构建springboot项目的解决的一些问题
- Spring Boot中使用RabbitMQ
- RabbitMQ的Java应用(3) -- 使用spring-boot-starter-amqp开发生产者应用
- Spring boot 下使用RabbitMQ报错:链接拒绝和不能创建队列
- Spring Boot中使用RabbitMQ
- Spring Boot 2.0.0.M7 使用异步消息服务-AMQP(RabbitMQ)
- 搭建Spring RabbitMQ消息服务时的一些注意事项
- Spring Boot中使用RabbitMQ
- 使用spring boot+logback的一些编码问题整理
- spring-boot实战【13】:Spring Boot中使用RabbitMQ
- spring-boot使用rabbitmq示例
- springboot使用RabbitMQ教程