# my_rabbitmq_test **Repository Path**: Wuboing/my_rabbitmq_test ## Basic Information - **Project Name**: my_rabbitmq_test - **Description**: 简易rabbitMq 测试代码; 借鉴https://gitee.com/shenzhanwang/Spring-rabbitMQ 重新练习了一份 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-04-24 - **Last Updated**: 2024-04-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # my_rabbitmq_test ## 介绍 rabbitmq 测试 ### 模型说明 1. 基本消息模型:生产者–>队列–>一个消费者 2. 订阅模型-Fanout:广播,将消息交给所有绑定到交换机的队列,每个消费者都可以收到同一条消息 3. 订阅模型-Direct:定向,把消息交给符合指定 rotingKey 的队列(路由模式) 4. 订阅模型-Topic:通配符,把消息交给符合routing pattern(主题模式)的队列 #### 基本消息模型 模式配置: //生产者消费者模式的配置,包括一个队列和两个对应的消费者 @Configuration public class ProducerConsumerConfig { @Bean public Queue myQueue2() { return new Queue("myqueue2"); } } 发送:(server 调用 传入队列名称和消息,parameter1 为'myqueue2', parameter2 为mail) @Transactional @Service("producer") public class ProducerImpl implements Producer { @Autowired RabbitTemplate rabbitTemplate; @Override public void sendMail(String queue, Mail mail) { rabbitTemplate.setQueue(queue); rabbitTemplate.convertAndSend(queue,mail); } } 声明消费者1 @Component public class QueueListener1 { @RabbitListener(queues = "myqueue2") public void displayMail(Mail mail) { System.out.println("QueueListener1: "+mail.toString()); } } 声明消费者2 @Component public class QueueListener2 { @RabbitListener(queues = "myqueue2") public void displayMail(Mail mail) { System.out.println("QueueListener2: "+mail.toString()); } } #### 订阅模型-Fanout //发布订阅模式的配置,包括两个队列和对应的订阅者,发布者的交换机类型使用fanout(子网广播),两根网线binding用来绑定队列到交换机 @Configuration public class PublishSubscribeConfig { @Bean public Queue myQueue1() { Queue queue=new Queue("queue1"); return queue; } @Bean public Queue myQueue2() { Queue queue=new Queue("queue2"); return queue; } @Bean public Queue myQueue3() { Queue queue=new Queue("queue3"); return queue; } @Bean public FanoutExchange fanoutExchange(){ return new FanoutExchange("fanout"); } @Bean public Binding binding1(){ Binding binding=BindingBuilder.bind(myQueue1()).to(fanoutExchange()); return binding; } @Bean public Binding binding2(){ Binding binding=BindingBuilder.bind(myQueue2()).to(fanoutExchange()); return binding; } @Bean public Binding binding3(){ Binding binding=BindingBuilder.bind(myQueue3()).to(fanoutExchange()); return binding; } } 声明消费者1 @Component public class SubscribeListener1 { @RabbitListener(queues = "queue1") public void subscribe(Mail mail) throws IOException { System.out.println("订阅者1收到消息"+mail.toString()); } } 声明消费者2 @Component public class SubscribeListener2 { @RabbitListener(queues = "queue2") public void subscribe(Mail mail) throws IOException { System.out.println("订阅者2收到消息"+mail.toString()); } } 调用: @Override public void publishMail(Mail mail) { rabbitTemplate.convertAndSend("fanout", "", mail); } #### 订阅模型-Direct:定向 @Configuration public class DirectExchangeConfig { ....可查看config配置 } 声明消费者1 @Component public class DircetListenetProple1 { @RabbitListener(queues = "myDirectQueue1") public void displayMail(Mail mail) { System.out.println("消费者1收到消息 : " + mail.toString()); } } 调用::(routingkey: 为DirectExchangeConfig中设定的 routingkey) @Override public void senddirectMail(Mail mail, String routingkey) { rabbitTemplate.convertAndSend("direct", routingkey, mail); } #### 订阅模型-Topic:通配符 //topic交换机模型,需要一个topic交换机,两个队列和三个binding @Configuration public class TopicExchangeConfig { ...可查看config配置 } 声明消费者 @Component public class TopicListener1 { @RabbitListener(queues = "topicqueue1") public void displayTopic(Mail mail) throws IOException { System.out.println("从topicqueue1取出消息"+mail.toString()); } } 调用:(routingkey: 为TopicExchangeConfig中设定的 routingkey) @Override public void sendtopicMail(Mail mail, String routingkey) { rabbitTemplate.convertAndSend("mytopic", routingkey, mail); }