
P:生产者,向Exchange发送消息,发送消息时,会指定一个routing key
X:Exchange(交换机),接受生产者的消息,然后把消息递交给与 routing key 完全匹配的队列
红色方块:队列,用于存放消息
C1:消费者,其所在队列指定了需要 routing key 为 error的消息
C2:消费者,其所在队列指定了需要 routing key 为 info、error、warning的消息

代码演示
创建一个简单的maven项目

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.0.RELEASE</version></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.8</version></dependency></dependencies>


<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
server:port: 8081spring:rabbitmq:####连接地址host: 192.168.137.5####端口号port: 5672####账号username: sunny####密码password: sunny### 交换机virtual-host: /sunny_vm
@Configurationpublic class RabbbitMqConfig {public static final String EXCHANGE_NAME = "sunny_routingkey_exchange";/*** SMS队列名称*/public static final String SMS_QUEUE_NAME = "sms_direct_routingkey_queue";/*** email队列名称*/public static final String EMAIL_QUEUE_NAME = "email_direct_routingkey_queue";/*** sms 路由key名称*/public static final String SMS_ROUTING_KEY = "sms_routing_key";/*** email 路由key名称*/public static final String EMAIL_ROUTING_KEY = "email_routing_key";/*** 声明短信队列** @return*/@Beanpublic Queue smsQueue() {return new Queue(SMS_QUEUE_NAME, true);}/*** 声明email队列** @return*/@Beanpublic Queue emailQueue() {return new Queue(EMAIL_QUEUE_NAME, true);}/*** 声明一个Direct类型的交换机** @return*/@Beanpublic DirectExchange directExchange() {return new DirectExchange(EXCHANGE_NAME);}/*** 将上面的sms队列绑定到Direct交换机** @param smsQueue* @param directExchange* @return*/@Beanpublic Binding smsQueueDirectExchange(Queue smsQueue, DirectExchange directExchange) {return BindingBuilder.bind(smsQueue).to(directExchange).with(SMS_ROUTING_KEY);}/*** 将上面的email队列绑定到Direct交换机** @param emailQueue* @param directExchange* @return*/@Beanpublic Binding emailQueueDirectExchange(Queue emailQueue, DirectExchange directExchange) {return BindingBuilder.bind(emailQueue).to(directExchange).with(EMAIL_ROUTING_KEY);}}
@Datapublic class UserEntity implements Serializable {private Integer id;private String name;}
@RestControllerpublic class SmsProducerController {@Autowiredprivate RabbitTemplate rabbitTemplate;@GetMapping("/send/sms")public void send() {UserEntity userEntity = new UserEntity();userEntity.setId(new Random().nextInt());userEntity.setName("短信:" + UUID.randomUUID().toString());rabbitTemplate.convertAndSend(RabbbitMqConfig.EXCHANGE_NAME, RabbbitMqConfig.SMS_ROUTING_KEY, userEntity);System.out.println("短信生产者消息发送成功!!!");}}@RestControllerpublic class EmailProducerController {@Autowiredprivate RabbitTemplate rabbitTemplate;@GetMapping("/send/email")public void send() {UserEntity userEntity = new UserEntity();userEntity.setId(new Random().nextInt());userEntity.setName("邮件:" + UUID.randomUUID().toString());rabbitTemplate.convertAndSend(RabbbitMqConfig.EXCHANGE_NAME, RabbbitMqConfig.EMAIL_ROUTING_KEY, userEntity);System.out.println("邮件生产者消息发送成功!!!");}}
http://localhost:8081/send/smshttp://localhost:8081/send/email





server:port: 8080spring:rabbitmq:####连接地址host: 192.168.137.5####端口号port: 5672####账号username: sunny####密码password: sunny### 交换机virtual-host: /sunny_vm
@Datapublic class UserEntity implements Serializable {private Integer id;private String name;}
@Component@RabbitListener(queues = {"email_direct_routingkey_queue"})public class EmailConsumerController {@RabbitHandlerpublic void one(UserEntity userEntity, Channel channel, Message message) {System.out.println("邮件队列接收到消息了!!!" + userEntity.getName());}}@Component@RabbitListener(queues = {"sms_direct_routingkey_queue"})public class SmsConsumerController {@RabbitHandlerpublic void one(UserEntity userEntity, Channel channel, Message message) {System.out.println("短信队列接收到消息了!!!" + userEntity.getName());}}


总结
1、队列与交换机的绑定,不能是任意绑定了,而是指定一个 RoutingKey(路由key)
2、消息的发送方,向Exchange发送消息时,也必须指定消息的RoutingKey
3、Exchange 不再把消息交给每一个绑定的队列,而是根据消息的RoutingKey进行判断,只有队列的RoutingKey与消息的RoutingKey完全一致,才会接受到消息
我是黎明大大,我知道我没有惊世的才华,也没有超于凡人的能力,但毕竟我还有一个不屈服,敢于选择向命运冲锋的灵魂,和一个就是伤痕累累也要义无反顾走下去的心。
如果您觉得本文对您有帮助,还请关注点赞一波,后期将不间断更新更多技术文章



文章转载自黎明大大,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




