交换机:
交换机的功能主要是接收消息并且转发到绑定的队列,交换机不存储消息,在启用 ack模式后,交换机找不到队列会返回错误。交换机有四种类型: Direct,topic,Headers and Fanout;

Direct Exchange:Direct Exchange 是 RabbitMQ 默认的交换机模式,也是最简单的模式,根据 key 全文匹配去寻找队列。

Topic Exchange
Topic Exchange 转发消息主要是根据通配符。 在这种交换机下,队列和交换机的绑定会
定义一种路由模式,那么,通配符就要在这种路由模式和路由键之间匹配后交换机才能转发
消息
Fanout Exchange
Fanout Exchange 消息广播的模式,不管路由键或者是路由模式,会把消息发给绑定给它的
全部队列,如果配置了 routing_key 会被忽略。
springboot集成rabbitmq的实现:
配置 pom 包,主要是添加 spring-boot-starter-amqp 的支持
org.springframework.boot spring-boot-starter-amqp 配置文件
spring:application:name: rabbitmq# 集成RabbitMQrabbitmq:host: 47.103.86.69port: 5672username: lisipassword: 123456
队列配置
简单模式实现:
//配置交换机: Direct Exchange(绑定路邮件的交换机)
@Configuration
public class RabbitConfig {public static final String QUEUE_NAME ="hello";@Beanpublic Queue queue(){return new Queue(QUEUE_NAME);}@Beanpublic Queue queue2(){Queue queue = new Queue("abc");queue.getArguments().put("x-max-length",5);return queue;}}
//消息的生产者
@Component
public class Sender {@Autowiredprivate AmqpTemplate amqpTemplate;/*** 生成消息并放入队列中*/public void sendEmail(String content){//发送的内容
// String content = "我注册成功了,发送一个邮件!";//要把信息放入队列的名称String queueName = RabbitConfig.QUEUE_NAME;amqpTemplate.convertAndSend(queueName,content);}
}//消息的接受者 消费者
@Component
@RabbitListener(queues = RabbitConfig.QUEUE_NAME)
@Log4j2
public class Receiver {/*** 接收到消息*/@RabbitHandlerpublic void receiveEmailMessage(String content){log.error("发送邮件,邮件的内容:"+content);}}
Topic Exchange实现 路由模式
//Topic Exchange 配置
@Configuration
public class TopicConfig {public static final String message = "topic.message";public static final String messages = "topic.messages";//队列message@Beanpublic Queue queueMessage() {return new Queue(TopicConfig.message);}//队列messages@Beanpublic Queue queueMessages() {return new Queue(TopicConfig.messages);}/*创建TopicExchange*/@Beanpublic TopicExchange exchange(){return new TopicExchange("my_topic");}/*** 把队列绑定到TopicExchange上*/@Beanpublic Binding bindingMessage(Queue queueMessage,TopicExchange exchange){return BindingBuilder.bind(queueMessage).to(exchange).with("topic.message");}@Beanpublic Binding bindingMessages(Queue queueMessages,TopicExchange exchange){return BindingBuilder.bind(queueMessages).to(exchange).with("topic.#");}}//生产者模式 需要制定路由关系 消息推送到那个交换机上
@Component
public class Sender3 {@Autowiredprivate AmqpTemplate amqpTemplate;/*** 发送到topic队列的消息*/public void sendTopicMessage(){//交换机名称String exchangeName = "my_topic";amqpTemplate.convertAndSend(exchangeName,"topic.message","我是topic信息");}
}消费者和简单模式一致
Fanout Exchange 广播者模式或者订阅者模式
//订阅者模式交换机和队列之间的路由
@Configuration
public class FanoutConfig {@Beanpublic Queue queueA() {return new Queue("fanout.A");}@Beanpublic Queue queueC() {return new Queue("fanout.C");}@Beanpublic Queue queueB() {return new Queue("fanout.B");}//交换机@Beanpublic FanoutExchange fanoutExchange(){return new FanoutExchange("fanout_exchange");}//把ABC三个队列绑定到fanout_exchange上@Beanpublic Binding bindA(Queue queueA,FanoutExchange fanoutExchange){return BindingBuilder.bind(queueA).to(fanoutExchange);}@Beanpublic Binding bindB(Queue queueB,FanoutExchange fanoutExchange){return BindingBuilder.bind(queueB).to(fanoutExchange);}@Beanpublic Binding bindC(Queue queueC,FanoutExchange fanoutExchange){return BindingBuilder.bind(queueC).to(fanoutExchange);}}//生产者模式
@Component
public class Sender3 {@Autowiredprivate AmqpTemplate amqpTemplate;/*** 发送到fanout队列的消息*/public void sendFanoutMessage(){//交换机名称String exchangeName = "fanout_exchange";amqpTemplate.convertAndSend(exchangeName,"","订阅信息:华尔街日报最新消息");}}消费者模式和简单模式一致