【RabbitMQ】使用SpringAMQP的消息队列(Hello Word)和工作队列(Work Queue)

SpringAMQP

SpringAMQP中文文档

Hello Word

**案例1:**利用SpringAMQP实现HelloWord中的集成消息队列功能

项目结构,如图:

1.引入AMQP依赖(父工程中)

xml 复制代码
<!--AMQP依赖,包含RabbitMQ-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

2.publisher包的application.yml中添加MQ连接信息

yml 复制代码
logging:
  pattern:
    dateformat: MM-dd HH:mm:ss:SSS
spring:
  rabbitmq:
    host: 192.168.174.129 # rabbitMQ的ip地址(我是在虚拟机上用docker安装的RabbitMQ)
    port: 5672 # 端口
    virtual-host: / # 虚拟主机
    username: itcast # 用户名
    password: 123321 # 密码

3.在消息发送者(publisher包)中新建一个测试类SpringAmqpTest,编写测试方法

java 复制代码
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringAmqpTest {
    @Autowired
    private RabbitTemplate rabbitTemplate
	@Test
	public void testSimpleQueue(){
		String queueName ="simple.queue"; //队列名称
		String message ="hello, spring amgp!"; //消息
		rabbitTemplate.convertAndSend(queueName,message);
    }
}

4.运行,结果

5.在consumer中编写消费逻辑,监听simple.queue

5.1consumer包的application.yml中添加MQ连接信息
yml 复制代码
logging:
  pattern:
    dateformat: MM-dd HH:mm:ss:SSS
spring:
  rabbitmq:
    host: 192.168.174.129 # rabbitMQ的ip地址(我是在虚拟机上用docker安装的RabbitMQ)
    port: 5672 # 端口
    virtual-host: / # 虚拟主机
    username: itcast # 用户名
    password: 123321 # 密码
5.2在消费者(consumer包)新建一个类SpringRabbitListener,编写消费逻辑
java 复制代码
@Component
public class SpringRabbitListener {
    
    @RabbitListener(queues="simple.queue")
	public void listenSimple0ueueMessage(String msg) throws InterruptedException {
		System.out.println("spring 消费者接收到消息 :【"+ msq +"】");
    }
}
5.3运行,结果

simple.queue队列中的消息也为空了

Work Queue

案例2:WorkQueue工作队列,实现一个队列绑定多个消费者

Work queue,工作队列,可以提高消息处理速度,避免队列消息堆积

前提:在案例1的基础上

1.在SpringAmqpTest添加新的发布

java 复制代码
//消息发送50次 
@Test
    public void testSendMessage2WorkQueue() throws InterruptedException {
        String queueName = "simple.queue";
        String message = "hello, message__";
        for (int i = 1; i <= 50; i++) {
            rabbitTemplate.convertAndSend(queueName, message + i);
            Thread.sleep(20); //休眠20秒
        }
    }

2.注释掉SpringRabbitListener上原有方法,添加新的消费

java 复制代码
 @RabbitListener(queues = "simple.queue")
    public void listenWorkQueue1(String msg) throws InterruptedException {
        System.out.println("消费者1接收到消息:【" + msg + "】" + LocalTime.now());
        Thread.sleep(20);
    }

    @RabbitListener(queues = "simple.queue")
    public void listenWorkQueue2(String msg) throws InterruptedException {
        System.err.println("消费者2........接收到消息:【" + msg + "】" + LocalTime.now());
        Thread.sleep(200);
    }

3.运行,结果

结果为消费,平均分配

4.消费预取限制,能者多劳---在消费者(consumer包)的application.yml修改

yml 复制代码
logging:
  pattern:
    dateformat: MM-dd HH:mm:ss:SSS
spring:
  rabbitmq:
    host: 192.168.174.129 # rabbitMQ的ip地址
    port: 5672 # 端口
    username: itcast
    password: 123321
    virtual-host: /
    listener:
      simple:
        prefetch: 1 # 每次只能获取一条消息,处理完成才能获取下一个消息

结果,如图:

相关推荐
阿无,11 分钟前
SpringCloudAlibaba Seata分布式事务 TCC模式
分布式
独行侠影a13 小时前
SpringBoot 分布式锁实战:Redisson 解决订单超卖并发问题
spring boot·分布式·后端
运维行者_17 小时前
网络监控与ITSM集成:从告警到工单,实现运维自动化闭环
开发语言·网络·分布式·后端·架构·flask·php
猿长大人20 小时前
C# | MediatR 入门指南:后端架构解耦
分布式·后端·架构·c#·.net
sunywz1 天前
【从零搭建物联网智能充电桩系统】选型篇:Netty、MQTT、RabbitMQ、IoTDB 为什么这么选?
物联网·rabbitmq·iotdb
蓝胖的四次元口袋1 天前
分布式知识梳理(2)
分布式
小罗水1 天前
附录D 常见问题排查指南
分布式
华章酱2 天前
基于 RabbitMQ 与 Hyperf 的消息顺序性保障方案
分布式·rabbitmq
Ai-_Man2 天前
豆包智能体内容批量导出:哪些该存、存成什么、怎么存v
人工智能·ai·小程序·word
ACP广源盛139246256732 天前
2026 PCIe互连芯片@ACP#国产替代格局解析:芯动科技领跑高端交换芯片赛道
大数据·网络·数据库·人工智能·分布式·嵌入式硬件