Rabbitmq(七)

68 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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模型使用

  1. 开发生产者
    @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");
    
            //  注:如果指定的队列没有生产者是不会自动创建队列的,
            //      因为如果队列没有消费者的话队列没有意义,队列自动创建是在消费者运行时创建的
        }
    }
    
  2. 开发消费者
    // 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模型使用

  1. 开发生产者
    @Autowired
    private RabbitTemplate rabbitTemplate;
    
    // work 模型
    @Test
    public void testWork(){           // 队列名称            发的消息
      for (int i = 0; i < 10; i++) {
        rabbitTemplate.convertAndSend("work", "work模型" + i);
      }
    }
    
  2. 开发消费者
    @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 广播模型

  1. 开发生产者
    @Autowired
    private RabbitTemplate rabbitTemplate;
    
    // fanout 广播
    @Test
    public void testFanout() throws InterruptedException { // 参数1:交换机名称  参数2:路由key  参数3:发送的消息
      rabbitTemplate.convertAndSend("logs","","Fanout的模型发送的消息");
    }
    
  2. 开发消费者
    @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 路由模型

  1. 开发生产者
    @Autowired
    private RabbitTemplate rabbitTemplate;
    
    // route 路由模式
    @Test
    public void testRoute (){          // 交换机名字   路由key   发送的消息
      rabbitTemplate.convertAndSend("directs","error","发送info的key的路由信息");
    }
    
  2. 开发消费者
    @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 订阅模型(动态路由模型)

  1. 开发生产者
    @Autowired
    private RabbitTemplate rabbitTemplate;
    
    //topic 动态路由 订阅模式
    @Test
    public void testTopic(){            // 交换机名字   路由key   发送的消息
      rabbitTemplate.convertAndSend("topics","order","order 路由消息");
    }
    
  2. 开发消费者
    @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);
        }
    }