您的位置:首页 > 编程语言 > Java开发

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 等都是比较常用的转化器,但是他们也是有局限性的,

不过使用 它们时有一个小问题,在不对它进行任何改造的前提下 ,发送消息的类和接受消息的类必须是一样的,不仅是要里面的字段一样,类名一样,连类的包路径都要一样。

4,

交换机:_Exchange 用于转发消息,但是它不会做存储_ ,如果没有 Queue bind 到 Exchange 的话,它会直接丢弃掉 Producer 发送过来的消息。常用交换机又分为3种类型:Direct Exchange,Topic Exchange,Fanout Exchange。


绑定:也就是交换机需要和队列相绑定,这其中如上图所示,是多对多的关系.

虚拟主机:一个虚拟主机持有一组交换机、队列和绑定。为什么需要多个虚拟主机呢?很简单,_RabbitMQ当中,用户只能在虚拟主机的粒度进行权限控制
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: