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

news2024/11/22 18:09:16

目录

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);
      }

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

redis哨兵练习

1、6台服务器&#xff0c;3台作一个主从&#xff0c;3台作哨兵 服务器IP主redis192.168.99.133从redis1192.168.99.139从redis2192.168.99.141哨兵1192.168.99.144哨兵2192.168.99.156哨兵3192.168.99.160 6台服务器安装好redis&#xff0c;全部执行&#xff1a; #把redis的…

C语言杂谈:函数栈帧,函数调用时到底发生了什么

我们都知道在调用函数时&#xff0c;要为函数在栈上开辟空间&#xff0c;函数后续内容都会在栈帧空间中保存&#xff0c;如非静态局部变量&#xff0c;返回值等。这段空间就叫栈帧。 当函数调用&#xff0c;就会开辟栈帧空间&#xff0c;函数返回时&#xff0c;栈帧空间就会被释…

读《淘宝技术这10年》:从进化中感受技术的美与挑战

本文作者:小米,一个热爱技术分享的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货! 大家好,我是小米,一个29岁的程序员,喜欢分享技术干货。今天,我想和大家聊一聊我最近读的一本书——《淘宝技术这10年》。这本书让我深刻领悟…

解决IDEA拉取或提交代码时SSL certificate problem: unable to get local issuer certificate问题

在使用IDEA拉取或提交GitHub上的代码时提示如下错误&#xff1a; 解决方法如下&#xff0c;依次执行命令&#xff1a; 在项目根目录下&#xff0c;打开Git Bash 1、echo | openssl s_client -servername github.com -connect github.com:443 | sed -ne /-BEGIN CERTIFICATE-/…

23 - 每位教师所教授的科目种类的数量(高频 SQL 50 题基础版)

23 - 每位教师所教授的科目种类的数量 考点&#xff1a; 排序和分组 selectteacher_id,count(distinct subject_id) cnt fromTeacher group byteacher_id;

SL3160 替换PN6008 耐压150V 降5V输出降压恒压芯片 脚位一样

在电子工程领域&#xff0c;芯片替换是一项常见且至关重要的任务。今天&#xff0c;我们将详细探讨SL3160芯片如何替换PN6008芯片&#xff0c;重点关注两者在耐压150V和降5V输出降压恒压方面的性能对比&#xff0c;以及它们脚位一致性的优势。 我们来了解一下SL3160和PN6008这两…

AE/PR插件中文汉化-StyleX V1.0.1动漫卡通绘画半色调漫画风格化特效

插件StyleX是一款采用人工智能AI技术的高级视频风格化工具&#xff0c;它不仅可以将素材转换为高质量的卡通片&#xff0c;还可以生成给定图像或视频风格的任意风格化视频。使用此工具&#xff0c;用户可以轻松创建创意风格化效果&#xff0c;例如卡通、绘画、绘画、半色调等等…

【大数据】计算引擎:Spark核心概念

目录 前言 1.什么是Spark 2.核心概念 2.1.Spark如何拉高计算性能 2.2.RDD 2.3.Stage 3.运行流程 前言 本文是作者大数据系列中的一文&#xff0c;专栏地址&#xff1a; https://blog.csdn.net/joker_zjn/category_12631789.html?spm1001.2014.3001.5482 该系列会成体…

翻译《The Old New Thing》- What’s with this MSH_MOUSEWHEEL message?

Whats with this MSH_MOUSEWHEEL message? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20080806-00/?p21353 Raymond Chen 2008年06月06日 MSH_MOUSEWHEEL 消息是怎么回事&#xff1f; 硬件团队正在研发一种鼠标滚轮设备&#xff0c;并…

LlamaIndex 一 简单文档查询

前言 在学习LangChain的时候&#xff0c;我接触到了LlamaIndex。它犹如我在开发vue时用到的axios&#xff0c;主要负责数据打理。别问我为什么打这个比方&#xff0c;前端老狗&#xff0c;重走AI路&#xff0c;闭关一年能否学的妥当&#xff1f; LlamaIndex 是一个用于 LLM 应…

【Python】教你彻底认识Python中的Web开发

​​​​ 文章目录 一、Web开发的基本概念1. Web服务器2. 客户端-服务器模型3. HTTP协议4. 前端与后端 二、常用的Web开发框架1. Django1.1 安装Django1.2 创建Django项目1.3 定义模型1.4 定义视图1.5 定义URL路由1.6 模板 2. Flask2.1 安装Flask2.2 创建Flask应用2.3 模板2.4…

Day 41 NGINX详解

Nginx详解 一、HTTP协议 HTTP协议是Hyper Text Transfer Protocol&#xff08;超文本传输协议&#xff09;的缩写,是用于从万维网&#xff08;WWW:World Wide Web &#xff09;服务器传输超文本到本地浏览器的传送协议。 1、HTTP 工作原理 HTTP协议通信流程 WEB Server&…

队列的实现及其应用

队列的概念 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作&#xff0c;具有先进先出的效果。入数据的一段称为队尾&#xff0c;出数据的一段称为队头。队列的应用是&#xff1a;1.维持公平性&#xff08;抽号&#xff09;、2.广度优先遍历…

JVM垃圾收集器和性能调优

目标&#xff1a; 1.JVM垃圾收集器有哪几种&#xff1f; 2.CMS垃圾收集器回收步骤。 一、JVM常见的垃圾回收器 为什么垃圾回收的时候需要STW? 标记垃圾的时候&#xff0c;如果不STW&#xff0c;可能用户线程就会不停的产生垃圾。 1.1 单线程收集 Serial和SerialOld使用单…

大语言模型应用与传统程序的不同

大语言模型&#xff08;LLM&#xff09; 被描述的神乎其神&#xff0c;无所不能&#xff0c;其实&#xff0c;大语言模型只是一个模型&#xff0c;它能够理解和生成自然语言&#xff0c;唯有依靠应用程序才能够发挥作用。例如&#xff0c;基于大模型可以构建一个最简单的会话机…

黑马python-JavaScript

1.JavaScript的定义&#xff1a; JavaScript是运行在浏览器端的脚步语言&#xff0c;是由浏览器解释执行的、简称js。它能够让网页和用户有交互功能&#xff0c;增加良好的用户体验效果 2.使用方式&#xff1a; 1.行内式&#xff08;主要用于事件&#xff09; <input type&q…

24-unittest简介

一、unittest简介 unittest是Python中常用的单元测试框架&#xff0c;与Java中的Junit单元测试框架类似。 二、示例程序 1&#xff09;导入unittest模块 import unittest 2&#xff09;使用help()函数查看源码中的示例程序 help(unittest) Simple usage:import unittestc…

Unity DOTS技术(二)ECS

文章目录 一.ECS简介二.基本操作实例三.实体查看组件四.位置实体修改五.旋转实体六.了解原有属性七.禁止自动创建八.动态实例化 一.ECS简介 ECS全称 (Entity Component System).即(E:实体 C:组件 S:系统). 实际上即是数据方法分离.数据放在组件里,具体实现放在系统里.组件挂载…

【excel】设置二级可变联动菜单

文章目录 【需求】在一级菜单选定后&#xff0c;二级菜单联动显示一级菜单下的可选项【步骤】step1 制作辅助列1.列转行2.在辅助列中匹配班级成员 step2 名称管理器step3 制作二级下拉菜单step4 消除二级菜单中的空白 【总结】 之前做完了 【excel】设置可变下拉菜单&#xff…

NPDP|智造业产品经理的战略智慧与行动之道

在智能制造风起云涌的时代&#xff0c;智造业产品经理的角色愈发重要。他们不仅需要具备深厚的行业知识&#xff0c;更要拥有前瞻的战略眼光和高效的行动能力。那么&#xff0c;智造业产品经理如何进行战略思考与行动呢&#xff1f;本文将为您揭示其中的奥秘。 洞察市场趋势&am…