码云地址:https://gitee.com/menbbo/springboot-rabbitmq-routing.git
RabbitMQ的工作模式包括了:简单模式、工作队列模式、发布订阅模式、路由模式、TOPIC(通配符模式)以及RPC。本文主要介绍路由模式。
上图是RabbitMQ的路由工作模式,该模式下一个交换机可以绑定多个队列,每个队列可以指定多个RoutingKey,每个消费者监听自己的队列,生产者将信息发送给交换机,交换机用该信息的routingkey判断与哪个队列的RoutingKey相等,将信息发送给与其RoutingKey相等的队列中。
SpringBoot整合RabbitMQ实现路由工作模式
实现生产者
1.创建父工程springboot-rabbit-routing,父工程下创建producer模块作为生产者,pom文件中导入依赖。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency>
2.application.properties配置文件中配置rabbitMQ相关信息:
spring.rabbitmq.host=127.0.0.1 spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest server.port=8082
3.创建RabbitConfig类,用来生成队列,交换机,并将其绑定,设定routingKey,在类中创建了emailQueue以及SMSQueue两个队列。
import org.springframework.amqp.core.Binding; import org.springframework.amqp.core.BindingBuilder; import org.springframework.amqp.core.DirectExchange; import org.springframework.amqp.core.Queue; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class RabbitmqConfig { @Bean(name = "emailQueue") public Queue createEmailQueue(){ return new Queue("emailQueue"); //创建email队列 } @Bean(name = "SMSQueue") public Queue createSMSQueue(){ return new Queue("SMSQueue"); // 创建SMS队列 } /** * 创建DirectExchange类型的交换机 * @return */ @Bean(name = "RoutingExChange") public DirectExchange directExchange(){ return new DirectExchange("RoutingExChange"); } /** * 将email队列与交换机绑定 * @return */ @Bean public Binding bindingExchangeEmail(@Qualifier("emailQueue") Queue eamilQueue,@Qualifier("RoutingExChange") DirectExchange directExchange){ return BindingBuilder.bind(eamilQueue).to(directExchange).with("email"); //将队列与交换机绑定 并设定routingkey } @Bean public Binding bindingExchangeSMS(@Qualifier("SMSQueue") Queue SMSQueue,@Qualifier("RoutingExChange") DirectExchange directExchange){ return BindingBuilder.bind(SMSQueue).to(directExchange).with("SMS"); //将RoutingExChange与队列SMSQueue绑定,设定routingKey为SMS } }
4.测试类中将信息发送到相关队列中,分别通过RoutingKey参数来实现发送信息到不同队列。
@SpringBootTest class ProducerApplicationTests { @Autowired private RabbitTemplate rabbitTemplate; @Test void contextLoads() { String message1 = "路由模式发送邮件信息"; rabbitTemplate.convertAndSend("RoutingExChange","email",message1);// String message2 = "路由模式发送SMS信息"; rabbitTemplate.convertAndSend("RoutingExChange","SMS",message2); } }
实现消费者
1.消费者共有两个,分别是sms_consumer和email_consumer。分别创建这两个module,以sms_consumer为例,首先导入maven依赖。
<dependency> <groupId>org.springframework.amqp</groupId> <artifactId>spring-rabbit</artifactId> </dependency>
2.配置RabbitMQ相关信息。
spring.rabbitmq.host=127.0.0.1 spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest server.port=8083
3.创建SMSConsumer类,用来从队列中接收信息。
@Component @RabbitListener(queues = "SMSQueue")//消费者对SMSQueue队列进行监听 public class SMSConsumer { @RabbitHandler public void receiveMessage(String data){ System.out.println("SMS消费信息:"+data); } }
实验结果:
启动生产者,查看RabbitMQ管理界面,发现队列中存放了信息。
分别启动两个消费者,消费者分别取得消息。