springboot中使用rabbitmq
创始人
2025-06-01 09:39:18

交换机:

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

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

  1. Topic Exchange

Topic Exchange 转发消息主要是根据通配符。 在这种交换机下,队列和交换机的绑定会

定义一种路由模式,那么,通配符就要在这种路由模式和路由键之间匹配后交换机才能转发

消息

  1. Fanout Exchange

Fanout Exchange 消息广播的模式,不管路由键或者是路由模式,会把消息发给绑定给它的

全部队列,如果配置了 routing_key 会被忽略。

  1. springboot集成rabbitmq的实现:

  1. 配置 pom 包,主要是添加 spring-boot-starter-amqp 的支持

 org.springframework.bootspring-boot-starter-amqp
  1. 配置文件

spring:application:name: rabbitmq# 集成RabbitMQrabbitmq:host: 47.103.86.69port: 5672username: lisipassword: 123456
  1. 队列配置

  1. 简单模式实现:

//配置交换机: 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);}}
  1. 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信息");}
}

消费者和简单模式一致

  1. 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,"","订阅信息:华尔街日报最新消息");}}

消费者模式和简单模式一致

相关内容

热门资讯

麦香面花开|传统花馍的仪式感,... 你发现没?春节吃啥都行,但少了花馍总觉得少了点年味。咱们老祖宗用面粉捏出的吉祥寓意,现在还能让人心情...
陕州花馍:在指尖上流传千年的面... 陕州花馍:在指尖上流传千年的面塑艺术 新闻记者 王红权通讯员 董芳远 王青伟 “二十八,把面发;二十...
年夜饭|3个传统家常菜,让团圆... 年夜饭,是中国人最温情的仪式 你发现没,一到年底,朋友圈全是回家的倒计时 78%的人说,最期待的...
原创 菠... 你是不是也遇到过这种情况?辛辛苦苦炒一盘,结果菠菜又黑又涩,鸡蛋又老又柴,整个盘子还汪着一滩水…… ...
省中医“健康年货” | 春节零... 年货满筐,不如健康在旁。 新春佳节,广东省中医院重磅推出【省中医健康年货】专栏——这里有大专家们精心...