一、开发中的大概过程
-
生产者工程:
-
application.yml文件配置RabbitMQ相关信息;
-
在生产者工程中编写配置类,用于创建交换机和队列,并进行绑定
-
注入RabbitTemplate对象,通过RabbitTemplate对象发送消息到交换机
-
-
消费者工程:
-
application.yml文件配置RabbitMQ相关信息
-
创建消息处理类,用于接收队列中的消息并进行处理
-
二、添加依耐和相应配置
-
生产者、消费者一样需要配置
-
导入坐标
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.4.RELEASE</version> </parent> <groupId>com.itheima</groupId> <artifactId>springboot-rabbitmq</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> </dependencies> </project>
-
配置rabbitmq相关信息
spring: rabbitmq: host: 127.0.0.1 port: 5672 username: nov17 password: nov17 virtual-host: testhost
重点掌握后面的几种工作模式的特点以及使用方法
三、RabbitMQ工作模式
1)提前了解
-
常用的交换机
-
DirectExchange:直连型交换机,根据消息携带的路由键,将消息转发给对应的队列
-
FanoutExchange:扇形交换机,接收到消息后会将消息转发到所有队列
-
TopicExchange:主题交换机,根据消息携带的路由键和交换机与队列绑定键的规则,将消息转发给对应的队列
-
-
规则
#
:匹配一个或多个词*
:匹配不多不少恰好1个词
2)简单模式 HelloWorld
-
一个生产者、一个消费者,不需要设置交换机(使用默认的交换机)
-
生产者代码:
创建RabbitMQ队列配置类com.example.rabbitmq_producer.config;
@Configuration public class RabbitMQConfig { //队列名称 public static final String SIMPLE_QUEUE = "simple_queue"; //声明队列 @Bean("simpleQueue") public Queue simpleQueue(){ return QueueBuilder.durable(SIMPLE_QUEUE).build(); } }
-
消费者代码:
编写消息监听器com.example.rabbitmq_consumer.listener;
@Component public class MyListener { /** * 监听某个队列的消息 * @param message 接收到的消息 */ @RabbitListener(queues = "simple_queue") public void printMsg(String msg) { System.out.println("消费者接收到的消息为:" + msg); } }
-
测试代码
在生产者工程springboot-rabbitmq-producer中创建测试类,发送消息:
@SpringBootTest public class RabbitMQTest { @Autowired private RabbitTemplate rabbitTemplate; @Test public void test(){ rabbitTemplate.convertAndSend(RabbitMQConfig.SIMPLE_QUEUE, "rabbitmq helloworld ..."); System.out.println("消息发送成功"); } }
3)工作队列模式 Work Queue
-
一个生产者、多个消费者(竞争关系),不需要设置交换机(使用默认的交换机)
-
生产者代码:
创建RabbitMQ队列配置类com.example.rabbitmq_producer.config;
@Configuration public class RabbitMQConfig { //队列名称 public static final String WORK_QUEUE = "work_queue"; //声明队列 @Bean("workQueue") public Queue workQueue(){ return QueueBuilder.durable(WORK_QUEUE).build(); } }
-
消费者代码:
编写消息监听器com.example.rabbitmq_consumer.listener;
消费者1:
@Component public class MyListener { /** * 监听某个队列的消息 * @param message 接收到的消息 */ @RabbitListener(queues = "work_queue") public void printMsg(String msg) { System.out.println("消费者1接收到的消息为:" + msg); } }
-
消费者2:
@Component public class MyListener { /** * 监听某个队列的消息 * @param message 接收到的消息 */ @RabbitListener(queues = "work_queue") public void printMsg(String msg) { System.out.println("消费者2接收到的消息为:" + msg); } }
-
测试代码
在生产者工程springboot-rabbitmq-producer中创建测试类,发送消息:
@SpringBootTest public class RabbitMQTest { @Autowired private RabbitTemplate rabbitTemplate; @Test public void test(){ rabbitTemplate.convertAndSend(RabbitMQConfig.WORK_QUEUE, "rabbitmq work queue ..."); System.out.println("消息发送成功"); } }
4)发布订阅模式 Publish/subscribe
-
需要设置类型为fanout的交换机,并且交换机和队列进行绑定,当发送消息到交换机后,交换机会将消息发送到绑定的队列
-
生产者代码
创建RabbitMQ队列配置类com.example.rabbitmq_producer.config;
@Configuration public class RabbitMQConfig { //交换机名称 public static final String ITEM_PS_EXCHANGE = "item_ps_exchange"; //队列名称 public static final String ITEM_QUEUE1 = "item_queue1"; public static final String ITEM_QUEUE2 = "item_queue2"; //声明交换机 @Bean("itemPsExchange") public FanoutExchange PsExchange(){ return ExchangeBuilder.fanoutExchange(ITEM_PS_EXCHANGE).build(); } //声明队列 @Bean("itemQueue1") public Queue itemQueue1(){ return QueueBuilder.durable(ITEM_QUEUE1).build(); } @Bean("itemQueue2") public Queue itemQueue2(){ return QueueBuilder.durable(ITEM_QUEUE2).build(); } //绑定队列和交换机 @Bean public Binding itemQueueExchange1(@Qualifier("itemQueue1") Queue queue, @Qualifier("itemPsExchange") FanoutExchange exchange){ return BindingBuilder.bind(queue).to(exchange); } @Bean public Binding itemQueueExchange2(@Qualifier("itemQueue2") Queue queue, @Qualifier("itemPsExchange") FanoutExchange exchange){ return BindingBuilder.bind(queue).to(exchange); } }
-
消费者代码
编写消息监听器com.example.rabbitmq_consumer.listener;
消费者1:
@Component public class MyListener { @RabbitListener(queues = "item_queue1") public void printMsg(String msg) { System.out.println("消费者1接收到的消息为:" + msg); } }
消费者2:
@Component public class MyListener { @RabbitListener(queues = "item_queue2") public void printMsg(String msg) { System.out.println("消费者2接收到的消息为:" + msg); } }
-
测试代码
在生产者工程springboot-rabbitmq-producer中创建测试类,发送消息:
@SpringBootTest public class RabbitMQTest { @Autowired private RabbitTemplate rabbitTemplate; @Test public void test(){ rabbitTemplate.convertAndSend(RabbitMQConfig.ITEM_PS_EXCHANGE,"", "rabbitmq pub/sub ..."); System.out.println("消息发送成功"); } }
5)路由模式 Routing
-
需要设置类型为direct的交换机,交换机和队列进行绑定,并且指定routing key,当发送消息到交换机后,交换机会根据routing key将消息发送到对应的队列
-
生产者代码:
创建RabbitMQ队列配置类com.example.rabbitmq_producer.config;
@Configuration public class RabbitMQConfig { //交换机名称 public static final String ITEM_ROUTING_EXCHANGE = "item_routing_exchange"; //队列名称 public static final String ITEM_QUEUE1 = "item_queue1"; public static final String ITEM_QUEUE2 = "item_queue2"; //声明交换机 @Bean("itemPsExchange") public Exchange PsExchange(){ return ExchangeBuilder.directExchange(ITEM_ROUTING_EXCHANGE).build(); } //声明队列 @Bean("itemQueue1") public Queue itemQueue1(){ return QueueBuilder.durable(ITEM_QUEUE1).build(); } @Bean("itemQueue2") public Queue itemQueue2(){ return QueueBuilder.durable(ITEM_QUEUE2).build(); } //绑定队列和交换机 @Bean public Binding itemQueueExchange1(@Qualifier("itemQueue1") Queue queue, @Qualifier("itemPsExchange") Exchange exchange){ return BindingBuilder.bind(queue).to(exchange).with("info").noargs(); } @Bean public Binding itemQueueExchange2(@Qualifier("itemQueue2") Queue queue, @Qualifier("itemPsExchange") Exchange exchange){ return BindingBuilder.bind(queue).to(exchange).with("error").noargs(); } }
-
消费者代码:
编写消息监听器com.example.rabbitmq_consumer.listener;
消费者1:
@Component public class MyListener { @RabbitListener(queues = "item_queue1") public void printMsg(String msg) { System.out.println("消费者1接收到的消息为:" + msg); } }
消费者2:
@Component public class MyListener { @RabbitListener(queues = "item_queue2") public void printMsg(String msg) { System.out.println("消费者2接收到的消息为:" + msg); } }
-
测试代码:
在生产者工程springboot-rabbitmq-producer中创建测试类,发送消息:
@SpringBootTest public class RabbitMQTest { @Autowired private RabbitTemplate rabbitTemplate; @Test public void test(){ rabbitTemplate.convertAndSend(RabbitMQConfig.ITEM_ROUTING_EXCHANGE,"error", "rabbitmq routing ..."); System.out.println("消息发送成功"); } }
6)通配符模式 Topic
-
需要设置类型为topic的交换机,交换机和队列进行绑定,并且指定通配符方式的routing key,当发送消息到交换机后,交换机会根据routing key将消息发送到对应的队列
Routingkey
一般都是有一个或多个单词组成,多个单词之间以”.”分割,例如:item.insert
通配符规则:
#
:匹配一个或多个词*
:匹配不多不少恰好1个词 -
生产者代码:
创建RabbitMQ队列配置类com.example.rabbitmq_producer.config;
@Configuration public class RabbitMQConfig { //交换机名称 public static final String ITEM_TOPIC_EXCHANGE = "item_topic_exchange"; //队列名称 public static final String ITEM_QUEUE1 = "item_queue1"; public static final String ITEM_QUEUE2 = "item_queue2"; //声明交换机 @Bean("itemPsExchange") public Exchange PsExchange(){ return ExchangeBuilder.topicExchange(ITEM_TOPIC_EXCHANGE).build(); } //声明队列 @Bean("itemQueue1") public Queue itemQueue1(){ return QueueBuilder.durable(ITEM_QUEUE1).build(); } @Bean("itemQueue2") public Queue itemQueue2(){ return QueueBuilder.durable(ITEM_QUEUE2).build(); } //绑定队列和交换机 @Bean public Binding itemQueueExchange1(@Qualifier("itemQueue1") Queue queue, @Qualifier("itemPsExchange") Exchange exchange){ return BindingBuilder.bind(queue).to(exchange).with("info.#").noargs(); } @Bean public Binding itemQueueExchange2(@Qualifier("itemQueue2") Queue queue, @Qualifier("itemPsExchange") Exchange exchange){ return BindingBuilder.bind(queue).to(exchange).with("error.#").noargs(); } }
-
消费者代码:
编写消息监听器com.example.rabbitmq_consumer.listener;
消费者1:
@Component public class MyListener { @RabbitListener(queues = "item_queue1") public void printMsg(String msg) { System.out.println("消费者1接收到的消息为:" + msg); } }
消费者2:
@Component public class MyListener { @RabbitListener(queues = "item_queue2") public void printMsg(String msg) { System.out.println("消费者2接收到的消息为:" + msg); } }
-
测试代码:
在生产者工程springboot-rabbitmq-producer中创建测试类,发送消息:
@SpringBootTest public class RabbitMQTest { @Autowired private RabbitTemplate rabbitTemplate; @Test public void test(){ rabbitTemplate.convertAndSend(RabbitMQConfig.ITEM_TOPIC_EXCHANGE,"info.select", "rabbitmq info.select ..."); rabbitTemplate.convertAndSend(RabbitMQConfig.ITEM_TOPIC_EXCHANGE,"info.insert", "rabbitmq info.insert ..."); rabbitTemplate.convertAndSend(RabbitMQConfig.ITEM_TOPIC_EXCHANGE,"error.delete", "rabbitmq error.delete ..."); System.out.println("消息发送成功"); } }