十七、SpringAMQP

目录

一、SpringAMQP的介绍:

二、利用SpringAMQP实现HelloWorld中的基础消息队列功能

1、因为publisher和consumer服务都需要amqp依赖,因此这里把依赖直接放到父工程mq-demo中

2、编写yml文件

3、编写测试类,并进行测试

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

1、导入依赖,刚才在父工程中已经导入了,所以省略

2、编写yml文件

3、新建类,实现消费逻辑

4、运行并测试

四、模拟WorkQueue,实现一个队列绑定多个消费者

1、编写生产者(生产50个消息)

2、编写消费者(一个消费者更快,一个消费者更慢)

3、测试

4、消费预取的修改

5、重新测试

五、发布和订阅

(一)利用SpringAMQP演示FanoutExchange的使用

1、新建config类,声明交换机和队列

2、启动项目,查看配置

3、编写消费者代码

4、编写生产者代码

5、运行代码,观察输出

(二)交换机的作用

(三)声明队列、交换机、绑定关系的Bean是什么?

(四)DirectExchange

1、编写消费者代码

2、编写生产者代码

(五)Direct交换机与Fanout交换机的差异

(六)TopicExchange

1、编写消费者代码

2、编写生产者代码

3、运行测试

4、描述下Direct交换机与Topic交换机的差异

(七)测试发送Object类型信息

1、新增队列

2、发送对象

3、查看

4、优化(使用jackson进行序列化)

5、接收消息


一、SpringAMQP的介绍:

  1. AMQP是一种高级消息队列协议。

  2. SpringAMQP是基于Spring Framework的AMQP扩展,提供了一个抽象层,使得使用AMQP进行消息传递变得更加简单。

  3. SpringAMQP支持多种消息传递模式,包括点对点、发布/订阅和请求/响应等。

  4. SpringAMQP提供了许多高级功能,例如队列管理、消息确认、事务和消息过滤等。

  5. SpringAMQP提供了集成测试工具和基于Spring Boot的自动配置,使得集成AMQP变得更加容易。

  6. 总之,SpringAMQP是一个灵活、可扩展的AMQP实现,它使得使用消息队列时变得更加容易和高效。

二、利用SpringAMQP实现HelloWorld中的基础消息队列功能

1、因为publisher和consumer服务都需要amqp依赖,因此这里把依赖直接放到父工程mq-demo中

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

2、编写yml文件

logging:
  pattern:
    dateformat: MM-dd HH:mm:ss:SSS
spring:
  rabbitmq:
    host: 192.168.248.152
    port: 5672
    virtual-host: /
    username: itcast
    password: 123456

3、编写测试类,并进行测试

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringAmqpTest {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Test
    public void testSendMassage(){
        String queue = "simple.queue";
        String massage="aaaaaaa";
        rabbitTemplate.convertAndSend(queue,massage);
    }
}

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

1、导入依赖,刚才在父工程中已经导入了,所以省略

2、编写yml文件

logging:
  pattern:
    dateformat: MM-dd HH:mm:ss:SSS
spring:
  rabbitmq:
    host: 192.168.248.152
    port: 5672
    virtual-host: /
    username: itcast
    password: 123456

3、新建类,实现消费逻辑

package cn.itcast.mq.listener;

import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
public class SpringRabbitListener {
    @RabbitListener(queues = "simple.queue")
    public void listenSimpleQueue(String msg){
        System.out.println("消费者接收到消息:"+msg);
    }
}

4、运行并测试

注意:

消息一旦消费就会从队列删除,RabbitMQ没有消息回溯功能

四、模拟WorkQueue,实现一个队列绑定多个消费者

1、编写生产者(生产50个消息)

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringAmqpTest {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Test
    public void testSendMassage(){
        String queue = "simple.queue";
        String massage="HelloWorld";

        for (int i = 0; i < 50; i++) {
            rabbitTemplate.convertAndSend(queue,massage);
        }
    }
}

2、编写消费者(一个消费者更快,一个消费者更慢)

@Component
public class SpringRabbitListener {
    @RabbitListener(queues = "simple.queue")
    public void listenSimpleQueue(String msg){
        System.out.println("消费者0接收到消息:"+msg+ LocalTime.now());
        try {
            Thread.sleep(20);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }

    @RabbitListener(queues = "simple.queue")
    public void listenSimpleQueue1(String msg){
        System.err.println("消费者1接收到消息__________-:"+msg+ LocalTime.now());
        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}

3、测试

我们发现,虽然消费者0更快,但是它并没有承担更多的工作量;

这是因为消费预取机制会让消费者事先分配好要处理的消息,而不是按能力分配;

4、消费预取的修改

可以在yml文件中修改

    listener:
      simple:
        prefetch: 1 #表示预取上限为1

5、重新测试

五、发布和订阅

(一)利用SpringAMQP演示FanoutExchange的使用

1、新建config类,声明交换机和队列
@Configuration
public class FanoutConfig {
    ///1
    @Bean
    public FanoutExchange fanoutExchange(){
        return new FanoutExchange("itcast.fanout");
    }

    @Bean
    public Queue fanoutQueue1(){
        return new Queue("fanout.queue1");
    }

    @Bean
    public Binding bindingQueue1(FanoutExchange exchange,Queue fanoutQueue1){
        return BindingBuilder.bind(fanoutQueue1).to(exchange);
    }

    ///2
    @Bean
    public Queue fanoutQueue2(){
        return new Queue("fanout.queue2");
    }

    @Bean
    public Binding bindingQueue2(FanoutExchange exchange,Queue fanoutQueue2){
        return BindingBuilder.bind(fanoutQueue2).to(exchange);
    }
}
2、启动项目,查看配置

绑定成功

3、编写消费者代码
    @RabbitListener(queues = "fanout.queue1")
    public void listenFanoutQueue1(String msg){
        System.err.println("消费者1接收到消息__________-:"+msg+ LocalTime.now());
    }

    @RabbitListener(queues = "fanout.queue2")
    public void listenFanoutQueue2(String msg){
        System.err.println("消费者2接收到消息__________-:"+msg+ LocalTime.now());
    }
4、编写生产者代码
    @Test
    public void sendFanoutMassage(){
        String exchangeName = "itcast.fanout";
        String message = "Hello Every One";
        rabbitTemplate.convertAndSend(exchangeName,"",message);
    }
5、运行代码,观察输出

发现两个消费者都接收到了消息

(二)交换机的作用

  • 接收publisher发送的消息
  • 将消息按照规则路由到与之绑定的队列
  • 不能缓存消息,路由失败,消息丢失
  • FanoutExchange的会将消息路由到每个绑定的队列

(三)声明队列、交换机、绑定关系的Bean是什么?

  • Queue
  • FanoutExchange
  • Binding
     

(四)DirectExchange

实现:

1、编写消费者代码
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "direct.queue2"),
            exchange = @Exchange(name = "itcast.direct",type = ExchangeTypes.DIRECT),
            key = {"red","blue"}
    ))
    public void listenDirectQueue1(String msg){
        System.err.println("消费者1接收到消息__________-:"+msg+ LocalTime.now());
    }

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "direct.queue2"),
            exchange = @Exchange(name = "itcast.direct",type = ExchangeTypes.DIRECT),
            key = {"red","yellow"}
    ))
    public void listenDirectQueue2(String msg){
        System.out.println("消费者2接收到消息__________-:"+msg+ LocalTime.now());
    }
2、编写生产者代码
    @Test
    public void sendDirectMassage(){
        String exchangeName = "itcast.direct";
        String message = "Hello Every One1111";
        rabbitTemplate.convertAndSend(exchangeName,"blue",message);
    }
    @Test
    public void sendDirectMassage(){
        String exchangeName = "itcast.direct";
        String message = "Hello Every One1111";
        rabbitTemplate.convertAndSend(exchangeName,"red",message);
    }

(五)Direct交换机与Fanout交换机的差异

  • Fanout交换机将消息路由给每一个与之绑定的队列
  • Direct交换机根据RoutingKey判断路由给哪个队列
  • 如果多个队列具有相同的RoutingKey,则与Fanout功能类似
     

基于@RabbitListener注解声明队列和交换机有哪些常见注解

  • @Queue
  • @Exchange
     

(六)TopicExchange

利用SpringAMQP演示TopicExchange的使用

1、编写消费者代码
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "topic.queue1"),
            exchange = @Exchange(name = "itcast.topic",type = ExchangeTypes.TOPIC),
            key = "china.#"
    ))
    public void listenTopicQueue1(String msg){
        System.out.println("消费者1接收到消息aaaaaa__-:"+msg+ LocalTime.now());
    }

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "topic.queue2"),
            exchange = @Exchange(name = "itcast.topic",type = ExchangeTypes.TOPIC),
            key = "#.news"
    ))
    public void listenTopicQueue2(String msg){
        System.err.println("消费者2接收到消息a__-:"+msg+ LocalTime.now());
    }
2、编写生产者代码
    @Test
    public void sendTopicMassage(){
        String exchangeName = "itcast.topic";
        String message = "Hello Every One12222";
        rabbitTemplate.convertAndSend(exchangeName,"china.news",message);
    }
3、运行测试

4、描述下Direct交换机与Topic交换机的差异

(七)测试发送Object类型信息

1、新增队列
    @Bean
    public Queue objectQueue(){
        return new Queue("object.queue");
    }
2、发送对象
    @Test
    public void sendObjectMassage(){
        Map<String ,Object> message = new HashMap<>();
        message.put("name","11");
        message.put("age","22");
        rabbitTemplate.convertAndSend("object.queue",message);
    }
3、查看

对象被序列化了,这种方式性能差,不安全(容易被注入)

4、优化(使用jackson进行序列化)

引入依赖 

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </dependency>

添加配置Bean

    @Bean
    public Jackson2JsonMessageConverter messageConverter(){
        return new Jackson2JsonMessageConverter();
    }

5、接收消息

编写配置Bean

    @Bean
    public Jackson2JsonMessageConverter messageConverter(){
        return new Jackson2JsonMessageConverter();
    }

编写消费者代码

@RabbitListener(queues = "object.queue")
public void listenObjectQueue1(Map<String,Object> msg){
    System.err.println("消费者接收到消息___da_______-:"+msg+ LocalTime.now());
}

验证

注意:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/172763.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

申银万国期货通过ZStack Cube信创超融合一体机打造金融信创平台

信创是数字中国建设的重要组成部分&#xff0c;也是数字经济发展的关键推动力量。作为云基础软件企业&#xff0c;云轴科技ZStack产品矩阵全面覆盖数据中心云基础设施&#xff0c;ZStack信创云首批通过可信云《一云多芯IaaS平台能力要求》先进级&#xff0c;是其中唯一兼容四种…

音视频开发是不是C++开发中最难的细分方向?

音视频开发是不是C开发中最难的细分方向&#xff1f; 是不是最难不敢说(毕竟数据库、Office、 大型游戏可能更难)&#xff0c;但确实也已经很难 了。至少对我 这种主要搞web前端的人来说&#xff0c;真的有那种力不从心的感觉。最近很多小伙伴找我&#xff0c;说想要一些音视频…

【微服务】SaaS云智慧工地管理平台源码

智慧工地系统是一种利用人工智能和物联网技术来监测和管理建筑工地的系统。它可以通过感知设备、数据处理和分析、智能控制等技术手段&#xff0c;实现对工地施工、设备状态、人员安全等方面的实时监控和管理。 一、智慧工地让工程施工智能化 1、内容全面&#xff0c;多维度数…

数字化转型导师坚鹏:数字化时代银行网点厅堂营销5大难点分析

数字化时代银行网点厅堂营销存在以下5大难点&#xff1a; 1、识别难。识别有效的客户比较难&#xff0c;传统的厅堂识别主要依据客户的衣着气质等主管感受&#xff0c;判断客户是否为潜在中高端客户&#xff0c;提供相关服务。大堂经理主管识别与智能化系统识别相结合&#xf…

5年经验之谈 —— 性能测试如何定位分析性能瓶颈?

你好&#xff0c;我是小牛&#xff0c;目前在一家准一线互联网大厂做测试开发工程师。 对于一般公司普通测试工程师来说&#xff0c;可能性能测试做的并不是很复杂&#xff0c;可能只是编写下脚本&#xff0c;做个压测&#xff0c;然后输出报告结果&#xff0c;瓶颈分析和调优…

经典双指针算法试题(一)

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、移动零1、题目讲解2、讲解算法原理3、代码实现 二、复写零1、题目讲解2、讲解算法原理3、…

湖科大计网:应用层

一、应用层概述 交互&#xff0c;实现特定问题&#xff01; 二、客户与服务器模型 一、C/S 客户/服务器方式 服务与被服务的关系。 二、P2P方式 对等方式 P2P方式是对等的&#xff0c;没有固定的服务器。 三、DNS域名系统 DNS&#xff08;Domain Name System&#xff09; 一、域…

Linux驱动之设备树

1、 Linux设备树的由来 1、1 为什么会有设备树 在Linux 2.6中&#xff0c;arch/arm/plat-xxx和arch/arm/mach-xxx中充斥着大量的垃圾代码&#xff0c;相当多数的代码只是在描述板级细节&#xff0c;而这些板级细节对于内核来讲&#xff0c;不过是垃圾&#xff0c;如板上的plat…

public private protected区别

北风胡乱刮着&#xff0c;我只想关上窗&#xff0c;煮着茶&#xff0c;在扑哧扑哧的白烟里心安理得地懒着。像郁达夫说得那样&#xff1a;“躲在屋里过活的两三个月的生活&#xff0c;却是一年之中最有劲的一段蛰居异境。”不管门外如何变幻莫测&#xff0c;围炉煮茶&#xff0…

深入解析Windows操作系统——概念和工具

文章目录 Windows操作系统的版本Windows NT和Windows 95基础概念和术语内核调试用户模式调试 Windows操作系统的版本 Windows NT和Windows 95 Windows NT和Windows 95之间的一些结构性差异&#xff0c;以及Windows NT优于Windows 95及其后续版本的一些方面&#xff1a; Wind…

(二)pytest自动化测试框架之添加测试用例步骤(@allure.step())

前言 在编写自动化测试用例的时候经常会遇到需要编写流程性测试用例的场景&#xff0c;一般流程性的测试用例的测试步骤比较多&#xff0c;我们在测试用例中添加详细的步骤会提高测试用例的可阅读性。 allure提供的装饰器allure.step()是allure测试报告框架非常有用的功能&am…

前端环境变量释义import.meta.env.xxx

视频教程 彻底搞懂前端环境变量使用和原理&#xff0c;超清楚_哔哩哔哩_bilibili 添加命令行参数 --modexxxxx 新建.env.xxxx文件,其中.env文件会在所有环境下生效 以VITE_开头&#xff0c;字符串无需加双引号 使用import.meta.env.VITE_xxxxx进行调用

WinEdt 11.1编辑器的尝鲜体验

WinEdt 11.1编辑器的尝鲜体验 2023年5月19日&#xff0c;WinEdt 11.1版本发布了&#xff0c;相比WinEdt 10.3, 最新版更加漂亮&#xff0c;更加友好&#xff0c;更加好用了&#xff01; 最大的改变是WinEdt 11.1 有了自带的WinEdtPDF阅读器&#xff0c;所以不再需要下载第三方…

同星智能完成A+轮超亿元融资,国投招商领投

2023年10月&#xff0c;上海同星智能科技有限公司成功完成超亿元A轮融资。本轮融资由国投招商管理的先进制造产业投资基金二期领投&#xff0c;老股东丰年资本超额跟投。 本轮融资将用于产品研发和全球化市场拓展。 同星智能成立于2017年&#xff0c;一直专注于研发国产自主可控…

java算法学习索引之数组矩阵问题

一 将正方形矩阵顺时针转动90 给定一个NN的矩阵matrix&#xff0c;把这个矩阵调整成顺时针转动90后的形式。 顺时针转动90后为&#xff1a; 【要求】额外空间复杂度为O&#xff08;1&#xff09;。 public void rotate(int[][] matrix) {int tR 0; // 左上角行坐标int tC 0;…

NUCLEO-L552ZE SWD外部接口定义

如果使用ST-LINK调试器对外部MCU编程需要将CN4上的跳线拔下。

MAC地址注册管理最佳实践:安全性、可用性和灵活性

MAC地址注册管理是在网络环境中确保设备身份验证和访问控制的重要步骤。本文将介绍MAC地址注册管理的最佳实践&#xff0c;旨在提高安全性、可用性和灵活性&#xff0c;以满足现代网络的需求。 随着网络规模和复杂性的不断增加&#xff0c;管理和维护设备身份变得至关重要。MAC…

MindSpore基础教程:使用 MindCV和 Gradio 创建一个图像分类应用

MindSpore基础教程&#xff1a;使用 MindCV和 Gradio 创建一个图像分类应用 官方文档教程使用已经弃用的MindVision模块&#xff0c;本文是对官方文档的更新 在这篇博客中&#xff0c;我们将探索如何使用 MindSpore 框架和 Gradio 库来创建一个基于深度学习的图像分类应用。我…

京东优惠券查询API接口接入方案,item_search_coupon - 京东优惠券查询接口演示

要接入京东优惠券查询API接口&#xff08;item_search_coupon&#xff09;&#xff0c;您可以按照以下步骤进行操作&#xff1a; 注册并获取API密钥&#xff1a;首先&#xff0c;您需要在京东开放平台上注册并获取API密钥。这将为您提供唯一的标识符和密钥&#xff0c;用于访问…

博主都在用的网站,一键制作电子杂志

​随着互联网的发展&#xff0c;越来越多的人开始使用电子杂志来展示自己的作品或宣传自己的品牌。而制作电子杂志的工具也越来越多&#xff0c;其中一些工具非常受欢迎&#xff0c;被许多博主使用。今天&#xff0c;我们就来介绍一款博主都在用的网站&#xff0c;它可以帮助你…