山东大学软件学院项目实训-创新实训-基于大模型的旅游平台(二十八)- 微服务(8)

目录

11.4 SpringAMQP

11.4.2 Work Queue工作队列

11.4.3 发布订阅模型

11.4.4 FanoutExchange(广播交换机)

11.4.5 DirectExchange(路由模式交换机)

11.4.6 TopicExchange

11.5 消息转换器


11.4 SpringAMQP

父工程引入AMQP依赖

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

编写测试方法

yml配置文件中编写配置

  
  spring:
    rabbitmq:
      host: 192.168.142.130   # rabbitmq的ip地址
      port: 5672  # 端口
      username: xxxxx
      password: xxxxxxx
      virtual-host: /

发消息测试

  
  @SpringBootTest
  public class AMQPTest {
  ​
      @Autowired
      private RabbitTemplate rabbitTemplate;
  ​
      @Test
      public void testSendMessage2SimpleQueue(){
          String queueName = "simple.queue";
          String message = "hello,spring amqp";
          rabbitTemplate.convertAndSend(queueName,message);
      }
  }

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

配置文件配置 :

  
  spring:
    rabbitmq:
      host: 192.168.142.129   # rabbitmq的ip地址
      port: 5672  # 端口
      username: xxxxx
      password: xxxxx
      virtual-host: /

编写监听类

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

启动主启动类,控制台可看到输出的监听到的消息

消息一旦被消费,就会从队列中删除,没有回收机制

11.4.2 Work Queue工作队列

publisher代码

  
      @Test
      public void testSendMessage2WorkQueue() throws InterruptedException {
          String queueName = "simple.queue";
          String message = "hello,spring amqp__";
          for(int i = 1 ; i <= 50 ; i ++){
              rabbitTemplate.convertAndSend(queueName,message + i);   
              Thread.sleep(20);
          }
      }

consumer接收消息

  
      // 消费者1
      @RabbitListener(queues = "simple.queue")
      public void ListenWork1Queue(String msg) throws InterruptedException {
          System.out.println("消费者1接收到simple.queue的消息 : " + msg + LocalTime.now());
          Thread.sleep(20);
      }
  ​
      // 消费者2
      @RabbitListener(queues = "simple.queue")
      public void ListenWork2Queue(String msg) throws InterruptedException {
          System.err.println("消费者2接收到simple.queue的消息 : " + msg + LocalTime.now());
          Thread.sleep(200);
      }

消息预取机制使得两者平均分配消息 不符预期

配置文件中 :

处理预取值

  
  spring:
    rabbitmq:
      host: 192.168.142.129   # rabbitmq的ip地址
      port: 5672  # 端口
      username: xxxxxx
      password: xxxxxxx
      virtual-host: /
      listener:
        simple:
          prefetch: 1    # 每次只能获取一条消息 ,处理完成才能获取下一个信息

11.4.3 发布订阅模型

11.4.4 FanoutExchange(广播交换机)

步骤一 : 声明交换机,队列 , 并绑定队列和交换机

在consumer中编写配置类

  
  @Configuration
  public class FanoutConfig {
      // 声明交换机
      @Bean
      public FanoutExchange fanoutExchange(){
          return new FanoutExchange("xinbo.fanout");
      }
  ​
      // 声明队列1
      @Bean
      public Queue fanoutQueue1(){
          return new Queue("fanout.queue1");
      }
  ​
      // 绑定队列1到交换机
      @Bean
      public Binding fanoutBindind(Queue fanoutQueue1,FanoutExchange fanoutExchange){
          return BindingBuilder
                  .bind(fanoutQueue1)
                  .to(fanoutExchange);
      }
  ​
      // 声明队列2
      @Bean
      public Queue fanoutQueue2(){
          return new Queue("fanout.queue2");
      }
  ​
      // 绑定队列2到交换机
      @Bean
      public Binding fanoutBindind2(Queue fanoutQueue2,FanoutExchange fanoutExchange){
          return BindingBuilder
                  .bind(fanoutQueue2)
                  .to(fanoutExchange);
      }
  }

消息监听 :

  
  @Component
  public class SpringRabbitListener {
  ​
      // 消费者1
      @RabbitListener(queues = "fanout.queue1")
      public void ListenWork1Queue(String msg) throws InterruptedException {
          System.out.println("消费者1接收到fanout.queue1的消息 : " + msg + LocalTime.now());
          Thread.sleep(20);
      }
  ​
      // 消费者2
      @RabbitListener(queues = "fanout.queue2")
      public void ListenWork2Queue(String msg) throws InterruptedException {
          System.err.println("消费者2接收到fanout.queue2的消息 : " + msg + LocalTime.now());
          Thread.sleep(200);
      }
  }

消息发送 :

  
      @Test
      public void testSendFanoutExchange(){
          String exchangeName = "xinbo.fanout";               // 交换机名称
          String message = "hello,everyone";
          rabbitTemplate.convertAndSend(exchangeName,null,message);
      }

11.4.5 DirectExchange(路由模式交换机)

利用@RabbitListener声明Exchange Queue RoutingKey

SpirngRabbitListener中

  
  @Component
  public class SpringRabbitListener {
  ​
      @RabbitListener(bindings = @QueueBinding(
              value = @Queue(name = "direct.queue1"),
              exchange = @Exchange(name = "xinbo.direct",type = ExchangeTypes.DIRECT),
              key = {"red","blue"}
      ))
      public void ListenDirectQueue1(String msg) throws InterruptedException {
          System.out.println("消费者接收到direct.queue1的消息 : " + msg + LocalTime.now());
          Thread.sleep(20);
      }
  ​
      @RabbitListener(bindings = @QueueBinding(
              value = @Queue(name = "direct.queue2"),
              exchange = @Exchange(name = "xinbo.direct",type = ExchangeTypes.DIRECT),
              key = {"red","yellow"}
      ))
      public void ListenDirectQueue2(String msg) throws InterruptedException {
          System.out.println("消费者接收到direct.queue2的消息 : " + msg + LocalTime.now());
          Thread.sleep(20);
      }
  ​
  }

发送消息测试 :

  
      @Test
      public void testSendDirectExchange(){
          // 交换机名称
          String exchangeName = "xinbo.direct";
          String message = "hello,blue";
          rabbitTemplate.convertAndSend(exchangeName,"blue",message);
      }

11.4.6 TopicExchange

绑定队列和交换机的关系 :

  
  @Component
  public class SpringRabbitListener {
      @RabbitListener(bindings = @QueueBinding(
              value = @Queue(name = "topic.queue1"),
              exchange = @Exchange(name="xinbo.topic",type = ExchangeTypes.TOPIC),
              key = "china.#"
      ))
      public void ListenTopicQueue1(String msg){
          System.out.println("消费者接收到topic.queue1的消息 : " + msg + LocalTime.now());
      }
  ​
      @RabbitListener(bindings = @QueueBinding(
              value = @Queue(name = "topic.queue2"),
              exchange = @Exchange(name="xinbo.topic",type = ExchangeTypes.TOPIC),
              key = "#.news"
      ))
      public void ListenTopicQueue2(String msg){
          System.out.println("消费者接收到topic.queue2的消息 : " + msg + LocalTime.now());
      }
  ​
  }

发送消息 :

  
      @Test
      public void testSendTopicExchange(){
          // 交换机名称
          String exchangeName = "xinbo.topic";
          String message = "中国发生了xxxxx";
          rabbitTemplate.convertAndSend(exchangeName,"china.news",message);
      }

11.5 消息转换器

发送和接受json类型的消息

添加依赖 :

  
          <dependency>
              <groupId>com.fasterxml.jackson.dataformat</groupId>
              <artifactId>jackson-dataformat-xml</artifactId>
          </dependency>

在配置类中

  
      @Bean
      public MessageConverter messageCondition(){
          return new Jackson2JsonMessageConverter();
      }

接收消息 :

引依赖 :同上

在Listener中 :

  
      @RabbitListener(queues = "object.queue")
      public void ListenObjectQueue(Map<String,Object> msg){
          System.out.println(msg);
      }

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

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

相关文章

什么无线领夹麦克风音质最好?领夹麦克风品牌排行榜前十名推荐

​在当今的数字化浪潮中&#xff0c;个人声音的传播和记录变得尤为重要。无论是会议中心、教室讲台还是户外探险&#xff0c;无线领夹麦克风以其卓越的便携性和连接稳定性&#xff0c;成为了人们沟通和表达的首选工具。面对市场上琳琅满目的无线麦克风选择&#xff0c;为了帮助…

中国出海企业“奔赴”俄罗斯蓝海 有哪些认知需要对齐? | TopOn变现干货

中国企业加速出海已成常态化。在出海大潮席卷下&#xff0c;中国企业的身影已遍布欧美、东南亚、拉美、中东等多个成熟市场和潜力市场&#xff0c;眼下&#xff0c;这些热门市场几成红海&#xff0c;准入门槛也相对提高。而俄罗斯市场&#xff0c;作为全球TOP10的经济体之一&am…

在Linux上的Java项目导出PDF乱码问题

在Linux上的Java项目导出PDF乱码问题 场景&#xff1a;一个Java项目导出PDF&#xff0c;在我本地导出是没有问题&#xff0c;但是部署上Linux上后&#xff0c;导出就出现了乱码了。 处理方案 我这里使用的处理方案是在Linux服务器上安装一些PDF需要使用的字体 1.把字体上传到…

找寻卓越的生成式人工智能应用案例?别浪费在无趣之处!

“ 生成式AI&#xff08;AI&#xff09;技术的强大众所周知。但不知道你们是否和我有一样感觉&#xff0c;目前市面上&#xff0c;企业对生成式AI的应用&#xff0c;场景大多较为单一。” Ingo Mierswa Altair产品开发高级副总裁 我说这些生成式AI的应用单一&#xff0c;是指…

upload-labs-第五关

目录 第五关 1、构造.user.ini文件 2、构造一个一句话木马文件&#xff0c;后缀名为jpg 3、上传.user.ini文件后上传flag.jpg 4、上传成功后访问上传路径 第五关 原理&#xff1a; 这一关采用黑名单的方式进行过滤&#xff0c;不允许上传php、php3、.htaccess等这几类文件…

区块链(Blockchain)调查研究

文章目录 1. 区块链是什么&#xff1f;2. 区块链分类和特点3. 区块链核心关键技术3.1 共识机制3.2 密码学技术3.4 分布式存储3.5 智能合约 4. 区块链未来发展趋势5. 区块链 Java 实现小案例 1. 区块链是什么&#xff1f; 区块链是分布式数据存储、点对点传输、共识机制、加密算…

在自己的esp idf工程中添加ESP-ADF

其实esp-adf也就相当于是一个组件&#xff0c;直接在工程的CMakeList.txt中加入就行&#xff0c;这样就可以满足自己的需要&#xff0c;直接在当前工程上增加adf&#xff0c;使用其中的部分功能。 参考adf基础工程可以发现&#xff0c;一条命令即可。 include($ENV{ADF_PATH}/…

【ocean】测试phaseDeg,phaseDegUnwrapped和phaseMargin

对二级运放进行测试 -101.35,78.01,78.01 GBW gainBwProd((VF("/Vout2") / VF("/Vin")))PHASE phaseDegUnwrapped((VF("/Vout2") / VF("/Vin")))plot( PHASE ?expr ( "PHASE" ) ) PHASEdeg phaseDeg((VF("/Vout2&q…

SQL语句练习每日5题(二)

题目1——查找学校是北大的学生信息 筛选出所有北京大学的学生进行用户调研&#xff0c;请你从用户信息表中取出满足条件的数据&#xff0c;结果返回设备id和学校。 解法&#xff1a;考察where条件语句 select device_id,university from user_profile where university北京…

如何做谷歌seo排名优化?Google SEO优化步骤你更快获得谷歌排名

谷歌SEO优化&#xff08;搜索引擎优化&#xff09;是一系列策略和技巧&#xff0c;旨在提高网站在谷歌搜索结果中的排名&#xff0c;从而增加有机流量。以下是一些关键的谷歌SEO优化步骤&#xff1a; 1. 关键词研究 选择合适的关键词&#xff1a;使用工具如Google Keyword Pl…

webservice、WCF、webAPI、MVC权限认证

webservice 权限认证 》》soapHeader SOAPHeader案例 服务引用下生成的服务方法参数中会自动加入一个soapHeader的参数&#xff0c; WEB服务引用则没有&#xff0c;我感觉采用WEB服务引用基于这种验证比较方便&#xff0c; 因为只需将soapHeader实例赋值一次就可以多次调用不…

windows11 安装cnpm 报错 Error: EPERM: operation not permitted 没权限

全部试过&#xff1a; 您遇到的错误是EPERM: operation not permitted&#xff0c;这意味着npm在尝试重命名文件或目录时缺少必要的权限。这通常与操作系统的权限设置有关。为了解决这个问题&#xff0c;您可以尝试以下几个步骤&#xff1a; 以管理员身份运行命令行&#xff1…

Python 可变长参数的魔法:灵活函数设计的秘密

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 什么是可变长参数&#xff1f; 在 Python 中&#xff0c;可变长参数允许你向函数传入任意数量的参数&#xff0c;而无需预先定义它们的个数。这为编写更加灵活和通用的函数提供了可能。可变长参数主要有两种形式&am…

使用kafka tools工具连接带有用户名密码的kafka

使用kafka tools工具连接带有用户名密码的kafka 创建kafka连接&#xff0c;配置zookeeper 在Security选择Type类型为SASL Plaintext 在Advanced页面添加如下图红框框住的内容 在JAAS_Config加上如下配置 需要加的配置&#xff1a; org.apache.kafka.common.security.plain.Pla…

如何通过内容识别关键词保护商业机密防泄漏

在数字化商业环境中&#xff0c;商业机密的保护对于企业的竞争力至关重要。随着数据泄露事件的增多&#xff0c;企业越来越需要采取有效措施来保护其敏感信息。内容识别技术&#xff0c;特别是关键词识别&#xff0c;已成为防止商业机密泄漏的重要手段。本文将探讨如何利用这一…

微软新AI工具 Recall 被白帽公开锤了?

近日&#xff0c;一些网络安全研究人员演示了恶意软件是如何成功窃取 Windows Recall 工具收集到的数据。 2024年5月21日&#xff0c;微软发布全新的“CopilotPC”&#xff0c;这类 AI PC 通过与高通的最新芯片合作&#xff0c;实现了一个叫做“Recall”的功能。借助这个人工智…

性能监控工具

性能是任何一款软件都需要关注的重要指标。除了软件的基本功 能&#xff0c;性能可以说是评价软件优劣的最重要的指标之一。我们该如何有 效地监控和诊断性能问题呢?本章基于实践&#xff0c;着重介绍一些针对系统 和Java虚拟机的监控和诊断工具&#xff0c;以帮助读者在实际开…

Camtasia Studio2024破解汉化版crack安装包下载地址

在当今数字化时代&#xff0c;视频内容已成为传播信息和吸引观众的重要方式。无论是企业宣传、在线教育还是个人创作&#xff0c;一款功能强大的视频编辑软件都是必不可少的工具。而Camtasia Studio2024作为业界领先的视频编辑软件&#xff0c;其永久免费版及最新版本的功能更是…

四、 【源码】数据源的解析、创建和使用

源码地址&#xff1a;https://github.com/mybatis/mybatis-3/ 仓库地址&#xff1a;https://gitcode.net/qq_42665745/mybatis/-/tree/04-datasource-use 数据源的解析、创建和使用 流程&#xff1a; 1.Resources加载MyBatis配置文件生成Reader字符流 2.SqlSessionFactory…

【JMeter接口测试工具】第二节.JMeter基本功能介绍(上)【入门篇】

文章目录 前言一、获取所有学院信息接口执行二、线程组的介绍 2.1 并发和顺序执行 2.2 优先和最后执行线程组 2.3 线程组的设置细节三、HTTP请求的介绍四、查看结果树的配置使用总结 前言 一、获取所有学院信息接口执行 我们先针对一条简单的接口进行执行&#…