开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第11天,点击查看活动详情
5. SpringBoot中使用RabbitMQ
5.0 搭建初始环境
1. 引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2. 配置配置文件
spring:
application:
name: springboot_rabbitmq
rabbitmq:
host: 10.15.0.9
port: 5672
username: ems
password: 123
virtual-host: /ems
RabbitTemplate 用来简化操作 使用时候直接在项目中注入即可使用
5.1 第一种hello world模型使用
-
开发生产者
@SpringBootTest(classes = RabbitmqSpringbootApplication.class) // 启动测试,指定测试的类 @RunWith(SpringRunner.class) // 启动Spring工厂 public class TestRabbitMQ { // 注入 rabbitTemplate @Autowired private RabbitTemplate rabbitTemplate; // hello world 模型 @Test public void testHello(){ // 转换和发送(转换:把消息转化为byte) 参数1:队列名称 参数2:发的消息 rabbitTemplate.convertAndSend("hello", "hello world"); // 注:如果指定的队列没有生产者是不会自动创建队列的, // 因为如果队列没有消费者的话队列没有意义,队列自动创建是在消费者运行时创建的 } } -
开发消费者
// rabbitmq中的消费者要加这个注解代表是rabbitmq中的消费者,监听,参数为指定这个消费者监听哪个队列的消息 // 默认持久化,非独占,不自动删除。 怎么设置是否独占,是否自动删除呢,在@RabbitListener类注解中参数设置 // @RabbitListener(queuesToDeclare = @Queue(value = "hello", durable = "false", autoDelete = "true")) 不持久化 自动删除 @Component @RabbitListener(queuesToDeclare = @Queue(value = "hello")) public class HelloConsumer { // 定义方法,方法名随便 @RabbitHandler // 表示这个方法是日后从队列中取出消息时的回调方法(即消费) public void receive1(String message){ // message就是消息队列中的消息 System.out.println("message = " + message); } }
5.2 第二种work模型使用
-
开发生产者
@Autowired private RabbitTemplate rabbitTemplate; // work 模型 @Test public void testWork(){ // 队列名称 发的消息 for (int i = 0; i < 10; i++) { rabbitTemplate.convertAndSend("work", "work模型" + i); } } -
开发消费者
@Component public class WorkConsumer { // 一个消费者 // work表示队列名字 @RabbitListener(queuesToDeclare = @Queue("work")) // @RabbitListener加在方法上代表这个方法会处理@RabbitListener监听的队列 public void receive1(String message){ System.out.println("work message1 = " + message); } // 一个消费者 @RabbitListener(queuesToDeclare = @Queue("work")) public void receive2(String message){ System.out.println("work message2 = " + message); } }说明:默认在Spring AMQP实现中Work这种方式就是公平调度,如果需要实现能者多劳需要额外配置
5.3 Fanout 广播模型
-
开发生产者
@Autowired private RabbitTemplate rabbitTemplate; // fanout 广播 @Test public void testFanout() throws InterruptedException { // 参数1:交换机名称 参数2:路由key 参数3:发送的消息 rabbitTemplate.convertAndSend("logs","","Fanout的模型发送的消息"); } -
开发消费者
@Component public class FanoutConsumer { @RabbitListener(bindings = @QueueBinding( // @QueueBinding绑定注解 value = @Queue, // @Queue表示生成临时队列,指定名称的话 @Queue("xxx") exchange = @Exchange(name="logs",type = "fanout") // 交换机的名字 交换机的类型 )) public void receive1(String message){ System.out.println("message1 = " + message); } @RabbitListener(bindings = @QueueBinding( value = @Queue, //创建临时队列 exchange = @Exchange(name="logs",type = "fanout") //绑定交换机类型 )) public void receive2(String message){ System.out.println("message2 = " + message); } }
5.4 Route 路由模型
-
开发生产者
@Autowired private RabbitTemplate rabbitTemplate; // route 路由模式 @Test public void testRoute (){ // 交换机名字 路由key 发送的消息 rabbitTemplate.convertAndSend("directs","error","发送info的key的路由信息"); } -
开发消费者
@Component public class RouteConsumer { @RabbitListener(bindings ={ @QueueBinding( value = @Queue, // 创建临时队列 exchange = @Exchange(value = "directs", type = "direct"), // 交换机名字 交换机类型 key = {"info","error","warn"} // 路由key数组 )}) public void receive1(String message){ System.out.println("message1 = " + message); } @RabbitListener(bindings ={ @QueueBinding( value = @Queue, // 创建临时队列 exchange = @Exchange(value = "directs", type = "direct"), // 交换机名字 交换机类型 key = {"error"} // 路由key数组 )}) public void receive2(String message){ System.out.println("message2 = " + message); } }
5.5 Topic 订阅模型(动态路由模型)
-
开发生产者
@Autowired private RabbitTemplate rabbitTemplate; //topic 动态路由 订阅模式 @Test public void testTopic(){ // 交换机名字 路由key 发送的消息 rabbitTemplate.convertAndSend("topics","order","order 路由消息"); } -
开发消费者
@Component public class TopicConsumer { @RabbitListener(bindings = { @QueueBinding( value = @Queue, // 临时队列 exchange = @Exchange(type = "topic",name = "topics"), // 交换机类型 交换机名字 key = {"user.save", "user.*"} // 路由key数组 ) }) public void receive1(String message){ System.out.println("message1 = " + message); } @RabbitListener(bindings = { @QueueBinding( value = @Queue, // 临时队列 exchange = @Exchange(type = "topic",name = "topics"), // 交换机类型 交换机名字 key = {"order.#", "product.#", "user.*"} // 路由key数组 ) }) public void receive2(String message){ System.out.println("message2 = " + message); } }