Fanout交换机
交换机的作用主要是接收发送者发送的消息,并将消息路由到与其绑定的队列
常见交换机的类型有以下三种
- Fanout:广播
- Direct:定向
- Topic:话题
Fanout Exchange会将接收到的消息路由到每一个跟其绑定的queue,所以也叫广播模式
Direct交换机
Direct Exchange会将接收到的消息根据规则路由到指定的Queue,因此称为定向路由。
●每一个Queue都与 Exchange设置一个BindingKey
●发布者发送消息时,指定消息的RoutingKey
●Exchange将消息路 由到BindingKey与消息RoutingKey-致的队列
Topic交换机
TopicExchange也是基于RoutingKey做消息路由,但是routingKey通常是多个单词的组合,并且以。分割。
Queue与Exchange指定BindingKey时可以使用通配符:
- #:代指0个或多个单词
- *:代指一个单词
声明队列交换机
SpringAMQP提供了几个类,用来声明队列、交换机及其绑定关系:
- Queue:用于声明队列,可以用工厂类QueueBuilder构建
- Exchange:用于声明交换机,可以用工厂类ExchangeBuilder构建
- Binding:用于声明队列和交换机的绑定关系,可以用工厂类BindingBuilder构建
例如
或者
SpringAMQP还提供了基于@RabbitListener注解来声明队列和交换机的方式:
消息转换器
Spring的对消息对象的处理是由org.springframework.amqp.support.converter.MessageConverter来处理的。而默认实现是SimpleMessageConverter,基于JDK的ObjectOutputStream完成序列化。
存在下列问题:
- JDK的序列化有安全 风险
- JDK序列化的消息太大
- JDK序列化的消息可读性差
建议采用JSON序列化代替默认的JDK序列化,要做两件事情:
在publisher和consumer中都要引入jackson依赖:
在publisher和consumer中都要配置MessageConverter: