【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 # 每次只能获取一条消息,处理完成才能获取下一个消息

结果,如图:

相关推荐
凌乱的豆包13 小时前
Spring Cloud Alibaba Nacos 服务注册发现和分布式配置中心
分布式
独隅14 小时前
PyTorch 分布式训练完整指南:策略、实现与模型选型
人工智能·pytorch·分布式
架构师老Y15 小时前
011、消息队列应用:RabbitMQ、Kafka与Celery
python·架构·kafka·rabbitmq·ruby
伟贤AI之路17 小时前
为什么AI里的公式复制到Word格式会乱?
人工智能·word·latex
墨北小七18 小时前
小说大模型的分布式训练——张量并行架构设计与实现
分布式
豆豆18 小时前
政务服务平台站群一体化解决方案
大数据·分布式·微服务·cms·政务·网站管理系统·站群cms
昵称暂无119 小时前
分布式事务难题:Seata框架在微服务中的落地实践
分布式·微服务·架构
都说名字长不会被发现19 小时前
分布式场景下的数据竞争问题与解决方案
分布式·乐观锁·悲观锁·redission·redis 分布式锁·数据版本
甘露s19 小时前
分布式与可重入性的一些问题
分布式
juniperhan19 小时前
Flink 系列第 3 篇:核心概念精讲|分布式缓存 + 重启策略 + 并行度 底层原理 + 代码实战 + 生产规范
大数据·分布式·缓存·flink