目录
2.更改resources配置文件名称为application.yml,增加配置参数
3.启动类SpringbootStudyApplication
4.在study下面新建各种包名,编写相应的代码(以下是常见模式)
[①.直连交换机模式(Direct Exchange)](#①.直连交换机模式(Direct Exchange))
1.打开pom.xml文件,添加依赖
XML
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--rabbitmq依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2.更改resources配置文件名称为application.yml,增加配置参数

XML
server:
port: 8888 #指定启动的端口
spring:
rabbitmq:
host: localhost # rabbitmq服务地址
port: 5672 # 端口号
username: guest # 用户名
password: guest # 密码
virtual-host: / # 虚拟主机
3.启动类SpringbootStudyApplication
java
package com.saas.study;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringbootStudyApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootStudyApplication.class, args);
}
}
4.在study下面新建各种包名,编写相应的代码(以下是常见模式)
①.直连交换机模式(Direct Exchange)

component层
java
package com.saas.study.component;
import com.saas.study.config.RabbitMqConfig;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* rabbitmq生产者
*/
@Component
public class RabbitMqProducer {
@Autowired
private RabbitTemplate rabbitTemplate;
//发送消息方法
public void sendMessage(String message) {
rabbitTemplate.convertAndSend(
RabbitMqConfig.TEST_EXCHANGE,
RabbitMqConfig.TEST_ROUTING_KEY,
message
);
System.out.println("生产者发送消息:" + message);
}
}
java
package com.saas.study.component;
import com.saas.study.config.RabbitMqConfig;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
/**
* rabbitmq消费者
*/
@Component
public class RabbitMqConsumer {
//监听指定队列
@RabbitListener(queues = RabbitMqConfig.TEST_QUEUE)
public void receiveMessage(String message) {
System.out.println("消费者接收消息:" + message);
}
}
config层
java
package com.saas.study.config;
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.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* rabbitmq配置类
*/
@Configuration
public class RabbitMqConfig {
//队列名称
public static final String TEST_QUEUE = "test_queue";
//交换机名称
public static final String TEST_EXCHANGE = "test_exchange";
//路由键
public static final String TEST_ROUTING_KEY = "test_routing_key";
//声明队列
@Bean
public Queue testQueue() {
//durable: 是否持久化,exclusive: 是否排他,autoDelete: 是否自动删除
return new Queue(TEST_QUEUE, true, false, false);
}
//声明直连交换机
@Bean
public DirectExchange testExchange() {
return new DirectExchange(TEST_EXCHANGE, true, false);
}
//绑定队列到交换机,并指定路由键
@Bean
public Binding bindingTestQueue(Queue testQueue, DirectExchange testExchange) {
return BindingBuilder.bind(testQueue).to(testExchange).with(TEST_ROUTING_KEY);
}
}
controller层
java
package com.saas.study.controller;
import com.saas.study.component.RabbitMqProducer;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* 访问rabbitmq控制类
*/
@RestController
public class RabbitMqController {
@Resource
private RabbitMqProducer rabbitMqProducer;
@GetMapping("/testSendMessage")
public void testSendMessage() {
rabbitMqProducer.sendMessage("hello rabbitmq");
}
}
②.广播模式(Fanout)

component层
java
package com.saas.study.component;
import com.saas.study.config.FanoutRabbitMqConfig;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* rabbitmq生产者
*/
@Component
public class RabbitMqProducer {
@Autowired
private RabbitTemplate rabbitTemplate;
//发送消息方法
public void sendMessage(String message) {
rabbitTemplate.convertAndSend(
FanoutRabbitMqConfig.FANOUT_EXCHANGE,
"", // 无需路由键
message
);
System.out.println("广播生产者发送消息:" + message);
}
}
java
package com.saas.study.component;
import com.saas.study.config.FanoutRabbitMqConfig;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
/**
* rabbitmq消费者一
*/
@Component
public class RabbitMqConsumerOne {
//监听指定队列
@RabbitListener(queues = FanoutRabbitMqConfig.FANOUT_QUEUE_ONE)
public void receiveMessage(String message) {
System.out.println("消费者接收队列一消息:" + message);
}
}
java
package com.saas.study.component;
import com.saas.study.config.FanoutRabbitMqConfig;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
/**
* rabbitmq消费者二
*/
@Component
public class RabbitMqConsumerTwo {
//监听指定队列
@RabbitListener(queues = FanoutRabbitMqConfig.FANOUT_QUEUE_TWO)
public void receiveMessage(String message) {
System.out.println("消费者接收队列二消息:" + message);
}
}
config层
java
package com.saas.study.config;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.context.annotation.Bean;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Configuration;
/**
* rabbitmq广播模式配置类
*/
@Configuration
public class FanoutRabbitMqConfig {
//交换机名称
public static final String FANOUT_EXCHANGE = "fanout_exchange";
//队列一名称
public static final String FANOUT_QUEUE_ONE = "fanout_queue_one";
//队列二名称
public static final String FANOUT_QUEUE_TWO = "fanout_queue_two";
//声明交换机
@Bean
public FanoutExchange fanoutExchange() {
// durable: 持久化,autoDelete: 不自动删除
return new FanoutExchange(FANOUT_EXCHANGE, true, false);
}
//声明队列一
@Bean
public Queue fanoutQueueOne() {
return new Queue(FANOUT_QUEUE_ONE, true, false, false);
}
//声明队列二
@Bean
public Queue fanoutQueueTwo() {
return new Queue(FANOUT_QUEUE_TWO, true, false, false);
}
//将队列定一绑定到交换机,这里无需要路由键
@Bean
public Binding bindingQueueOne(Queue fanoutQueueOne, FanoutExchange fanoutExchange) {
return BindingBuilder.bind(fanoutQueueOne).to(fanoutExchange);
}
//将队列定二绑定到交换机,这里无需要路由键
@Bean
public Binding bindingQueueTwo(Queue fanoutQueueTwo, FanoutExchange fanoutExchange) {
return BindingBuilder.bind(fanoutQueueTwo).to(fanoutExchange);
}
}
controller层
java
package com.saas.study.controller;
import com.saas.study.component.RabbitMqProducer;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* 访问rabbitmq控制类
*/
@RestController
public class RabbitMqController {
@Resource
private RabbitMqProducer rabbitMqProducer;
@GetMapping("/testSendMessage")
public void testSendMessage() {
rabbitMqProducer.sendMessage("hello rabbitmq");
}
}
③.通配符模式(Topic)

component层
java
package com.saas.study.component;
import com.saas.study.config.TopicRabbitMqConfig;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* rabbitmq生产者
*/
@Component
public class RabbitMqProducer {
@Autowired
private RabbitTemplate rabbitTemplate;
//发送消息方法
public void sendMessage(String routingKey, String message) {
rabbitTemplate.convertAndSend(
TopicRabbitMqConfig.TOPIC_EXCHANGE,
routingKey,
message
);
System.out.println("生产者发送消息,路由键:"+routingKey+",消息:"+message);
}
}
java
package com.saas.study.component;
import com.saas.study.config.TopicRabbitMqConfig;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
/**
* rabbitmq消费者一
*/
@Component
public class RabbitMqConsumerOne {
//监听指定队列,匹配user.*
@RabbitListener(queues = TopicRabbitMqConfig.TOPIC_QUEUE_ONE)
public void receiveMessage(String message) {
System.out.println("消费者接收队列一消息:" + message);
}
}
java
package com.saas.study.component;
import com.saas.study.config.TopicRabbitMqConfig;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
/**
* rabbitmq消费者二
*/
@Component
public class RabbitMqConsumerTwo {
//监听指定队列,匹配*.order
@RabbitListener(queues = TopicRabbitMqConfig.TOPIC_QUEUE_TWO)
public void receiveMessage(String message) {
System.out.println("消费者接收队列二消息:" + message);
}
}
java
package com.saas.study.component;
import com.saas.study.config.TopicRabbitMqConfig;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
/**
* rabbitmq消费者三
*/
@Component
public class RabbitMqConsumerThree {
//监听指定队列,匹配#.stock
@RabbitListener(queues = TopicRabbitMqConfig.TOPIC_QUEUE_THREE)
public void receiveMessage(String message) {
System.out.println("消费者接收队列三消息:" + message);
}
}
config层
java
package com.saas.study.config;
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* rabbitmq通配符模式配置类
*/
@Configuration
public class TopicRabbitMqConfig {
//交换机名称
public static final String TOPIC_EXCHANGE = "topic_exchange";
//队列一名称
public static final String TOPIC_QUEUE_ONE = "topic_queue_one";
//队列二名称
public static final String TOPIC_QUEUE_TWO = "topic_queue_two";
//队列三名称
public static final String TOPIC_QUEUE_THREE = "topic_queue_three";
//声明交换机
@Bean
public TopicExchange topicExchange() {
// durable: 持久化,autoDelete: 不自动删除
return new TopicExchange(TOPIC_EXCHANGE, true, false);
}
//声明队列一
@Bean
public Queue topicQueueOne() {
return new Queue(TOPIC_QUEUE_ONE, true, false, false);
}
//声明队列二
@Bean
public Queue topicQueueTwo() {
return new Queue(TOPIC_QUEUE_TWO, true, false, false);
}
//声明队列三
@Bean
public Queue topicQueueThree() {
return new Queue(TOPIC_QUEUE_THREE, true, false, false);
}
//将队列定一绑定到交换机
@Bean
public Binding bindingQueueOne(Queue topicQueueOne, TopicExchange topicExchange) {
return BindingBuilder.bind(topicQueueOne).to(topicExchange).with("user.*"); //匹配user.xxx;
}
//将队列定二绑定到交换机
@Bean
public Binding bindingQueueTwo(Queue topicQueueTwo, TopicExchange topicExchange) {
return BindingBuilder.bind(topicQueueTwo).to(topicExchange).with("*.order"); //匹配xxx.order
}
//将队列定三绑定到交换机
@Bean
public Binding bindingQueueThree(Queue topicQueueThree, TopicExchange topicExchange) {
return BindingBuilder.bind(topicQueueThree).to(topicExchange).with("#.stock"); //匹配xxx.stock或xxx.xxx.stock等
}
}
controller层
java
package com.saas.study.controller;
import com.saas.study.component.RabbitMqProducer;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* 访问rabbitmq控制类
*/
@RestController
public class RabbitMqController {
@Resource
private RabbitMqProducer rabbitMqProducer;
@GetMapping("/testSendMessage")
public void testSendMessage() {
//路由键=user.info → 匹配 user.*
rabbitMqProducer.sendMessage("user.info", "用户注册通知");
//路由键=create.order → 匹配 *.order
rabbitMqProducer.sendMessage("create.order", "订单创建成功");
//路由键=admin.add.stock → 匹配 #.stock
rabbitMqProducer.sendMessage("admin.add.stock", "管理增加库存通知");
//路由键=stock → 匹配 #.stock
rabbitMqProducer.sendMessage("stock", "库存通知");
}
}
5.使用postman访问

6.查看开发工具控制台日志
①.直连交互机模式

②.广播模式

③.通配符模式

7.下载地址
①.直连交互机模式
百度云: https://pan.baidu.com/s/1_aJ07Bp5JDE23gwdxmpzjw 提取码: 3tst
②.广播模式
百度云: https://pan.baidu.com/s/1R1LxE4w_NDigCf2dwzODYw 提取码: xv5e
③.通配符模式
百度云: https://pan.baidu.com/s/1WvZ6CL96MIcAOwJmsr4uGg 提取码: e4zx