• RabbitMQ 的快速使用


    docker部署rabbitmq

     # management才有管理页面
    docker pull rabbitmq:management
    
    # 新建容器并运行
    docker run \
     -e RABBITMQ_DEFAULT_USER=admin \ 
     -e RABBITMQ_DEFAULT_PASS=admin \ 
     -v mq-plugins:/plugins \
     --name mq \
     --hostname mq \
     -p 15672:15672 \
     -p 5672:5672 \
     -itd \
     rabbitmq:management
    
    # 查看运行状态
    docker ps -a
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

     


     

    导入RabbitMQ依赖

    pom.xml
    
    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-amqpartifactId>
    dependency>
    
    <dependency>
        <groupId>com.fasterxml.jackson.dataformatgroupId>
        <artifactId>jackson-dataformat-xmlartifactId>
        <version>2.9.10version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

     

    提供者和消费者的配置

    application.yml
    spring:
      rabbitmq:
        host: 192.168.137.139 # 主机名
        port: 5672 # 端口
        virtual-host: / # 虚拟主机
        username: admin # 用户名
        password: admin # 密码
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

     

    消息转换器

    提供者和消费者都可以添加

    RabbitMQMessageConverterConfig.java
    @Configuration
    public class RabbitMQMessageConverterConfig {
        @Bean
        public static MessageConverter jsonMessageConverter() {
            return new Jackson2JsonMessageConverter();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

     

    注意执行顺序:需要先使用consumer监听并创建队列(需要保证队列存在!),publisher再往里面添加队列才会有用,否则白添加队列

     


     

    SimpleQueue

    在这里插入图片描述

    提供者: SimpleQueuePublisher.java
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class SimpleQueuePublisher {
        @Autowired
        private RabbitTemplate rabbitTemplate;
    
        @Test
        public void simpleQueueTest() {
            String msg = "hello, simple queue";
            rabbitTemplate.convertAndSend("simple.queue", msg);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    消费者SimpleQueueConsumer.java
    @Component
    public class SimpleQueueConsumer {
        @RabbitListener(queues = "simple.queue")
        public void simpleQueueConsumer(String msg) {
            System.out.println("simpleQueueConsumer: " + msg);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

     


     

    Work Queues

    在这里插入图片描述

    可加配置

    application.yml

    spring:
      rabbitmq:
        listener:
          simple: # simple类型
            prefetch: 1 # consumer每次执行预取的数量
    
    • 1
    • 2
    • 3
    • 4
    • 5
    消费者:WorkQueueConsumer.java
    @Component
    public class WorkQueueConsumer {
        @RabbitListener(queuesToDeclare = {@Queue(name = "work.queue")})
        public void workQueue1Consumer(String msg) throws InterruptedException {
            System.out.println("workQueue1Consumer: " + msg);
            Thread.sleep(10);
        }
    
        @RabbitListener(queuesToDeclare = {@Queue(name = "work.queue")})
        public void workQueue2Consumer(String msg) throws InterruptedException {
            System.out.println("workQueue2Consumer: " + msg);
            Thread.sleep(90);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    提供者: WorkQueuePublisher.java
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class WorkQueuePublisher {
        @Autowired
        private RabbitTemplate rabbitTemplate;
    
        @Test
        public void workQueueTest() {
            for (int i = 1; i <= 100; i ++ ) {
                String msg = "hello, work queue. " + i;
                rabbitTemplate.convertAndSend("work.queue", msg);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

     


     

    发布/订阅

    Fanout

    在这里插入图片描述

    消费者:FanoutQueueConsumer.java
    @Exchange@Queue注解中的declare属性默认为"true",如果不存在会自动创建exchange和queue。
    @Component
    public class FanoutQueueConsumer {
        @RabbitListener(bindings = @QueueBinding(
                exchange = @Exchange(name = "fanout", type = ExchangeTypes.FANOUT),
                value = @Queue(name = "fanout.queue1")
        ))
        public void fanoutQueue1Consumer(String msg) {
            System.out.println("fanoutQueue1Consumer: " + msg);
        }
    
        @RabbitListener(bindings = @QueueBinding(
                exchange = @Exchange(name = "fanout", type = ExchangeTypes.FANOUT),
                value = @Queue(name = "fanout.queue2")
        ))
        public void fanoutQueue2Consumer(String msg) {
            System.out.println("fanoutQueue2Consumer: " + msg);
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    提供者: FanoutQueuePublisher.java
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class FanoutQueuePublisher {
        @Autowired
        private RabbitTemplate rabbitTemplate;
    
        @Test
        public void fanoutQueueTest() {
            String exchangeName = "fanout";
            String msg = "hello, fanout queue.";
            rabbitTemplate.convertAndSend(exchangeName, "", msg);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

     


     

    Routing / Direct

    在这里插入图片描述

    消费者:DirectQueueConsumer.java
    @Component
    public class DirectQueueConsumer {
        @RabbitListener(bindings = @QueueBinding(
                exchange = @Exchange(name = "direct", type = ExchangeTypes.DIRECT),
                value = @Queue(name = "direct.queue1")
        ))
        public void directQueue1Consumer(String msg) {
            System.out.println("directQueue1Consumer: " + msg);
        }
    
        @RabbitListener(bindings = @QueueBinding(
                exchange = @Exchange(name = "direct", type = ExchangeTypes.DIRECT),
                value = @Queue(name = "direct.queue2")
        ))
        public void directQueue2Consumer(String msg) {
            System.out.println("directQueue2Consumer: " + msg);
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    提供者: DirectQueuePublisher.java
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class DirectQueuePublisher {
        @Autowired
        private RabbitTemplate rabbitTemplate;
    
        @Test
        public void directQueueTest() {
            String exchangeName = "direct";
            String key = "error";
    //        String key = "warning";
            String msg = "hello, direct queue, " + key;
            rabbitTemplate.convertAndSend(exchangeName, key, msg);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

     


     

    Topics

    *: 通配一个单词#: 通配多个单词

    在这里插入图片描述

    消费者:TopicQueueConsumer.java
    @Configuration
    public class TopicQueueConsumer {
        @RabbitListener(bindings = @QueueBinding(
                exchange = @Exchange(name = "topic", type = ExchangeTypes.TOPIC),
                value = @Queue(name = "topic.queue1"),
                key = {"*.orange.*"}
        ))
        public void topicQueue1Consumer(String msg) {
            System.out.println("topicQueue1Consumer: " + msg);
        }
    
        @RabbitListener(bindings = @QueueBinding(
                exchange = @Exchange(name = "topic", type = ExchangeTypes.TOPIC),
                value = @Queue(name = "topic.queue2"),
                key = {"*.*.rabbit", "lazy.#"}
        ))
        public void topicQueue2Consumer(String msg) {
            System.out.println("topicQueue2Consumer: " + msg);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    提供者: TopicQueuePublisher.java
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class TopicQueuePublisher {
        @Autowired
        private RabbitTemplate rabbitTemplate;
    
        @Test
        public void topicQueueTest() {
            String exchangeName = "topic";
            String key = "lazy.orange.rabbit";
            String msg = "hello, topic queue. " + key;
            rabbitTemplate.convertAndSend(exchangeName, key, msg);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
  • 相关阅读:
    .net core 使用异步等待(Async-await)在Foreach中提示“连接不支持 MultipleActiveResultSets”
    Linux简介-特点、基本思想、工作原理、主要功能、内核、发行版本、应用、终端、命令提示符、目录结构、文件
    BATJ最全架构技术合集:Docker+Spring+Nginx+Netty+MySQL
    JavaCV音视频开发宝典:rtp广播方式音视频传输(一对多音视频会议)
    【Leetcode】1223. Dice Roll Simulation
    金山wps golang面试题总结
    数控程序传输DNC服务、数控刀补服务(发那科fanuc、西门子、三菱、广数、新代、华中、宝元、马扎克、大畏Okuma)等数据采集服务
    住房贷款等额本息(等额本金)还款计划计算
    django环境配置出错
    AI内容生成时代:该如何和AI对话?
  • 原文地址:https://blog.csdn.net/m1015422754/article/details/132593013