RabbitMQ(七大模式+微服务+自用)

news2026/5/21 20:22:34
一、前置准备安装并启动 RabbitMQ默认端口 5672JDK 8、Maven、IDEA所有项目通用工具类 通用 pom直接复制二、全局统一配置所有项目必用1. 公共连接工具类 ConnectionUtil.javajava运行package com.mq.util; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; /** * RabbitMQ 公共连接工具类所有项目通用 */ public class ConnectionUtil { // 获取RabbitMQ连接 public static Connection getConnection() throws Exception { ConnectionFactory factory new ConnectionFactory(); factory.setHost(localhost); factory.setPort(5672); factory.setUsername(guest); factory.setPassword(guest); return factory.newConnection(); } // 关闭连接和通道 public static void close(Connection conn, Channel channel) { try { if (channel ! null) channel.close(); if (conn ! null) conn.close(); } catch (Exception e) { e.printStackTrace(); } } }2. 通用 pom.xml原生 Java 项目xml?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion groupIdcom.mq/groupId !-- 替换为项目名simple-demo / work-demo 等 -- artifactId项目名/artifactId version1.0/version dependencies !-- RabbitMQ客户端依赖 -- dependency groupIdcom.rabbitmq/groupId artifactIdamqp-client/artifactId version5.18.0/version /dependency /dependencies /project三、项目 1simple-demo 简单模式项目结构plaintextsimple-demo ├── src/main/java/com/mq │ ├── util/ConnectionUtil.java │ ├── Producer.java │ └── Consumer.java └── pom.xml完整代码生产者 Producer.javajava运行package com.mq; import com.mq.util.ConnectionUtil; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; public class Producer { private static final String QUEUE simple_queue; public static void main(String[] args) throws Exception { Connection conn ConnectionUtil.getConnection(); Channel channel conn.createChannel(); channel.queueDeclare(QUEUE, false, false, false, null); String msg 简单模式消息; channel.basicPublish(, QUEUE, null, msg.getBytes()); System.out.println(发送 msg); ConnectionUtil.close(conn, channel); } }消费者 Consumer.javajava运行package com.mq; import com.mq.util.ConnectionUtil; import com.rabbitmq.client.*; public class Consumer { private static final String QUEUE simple_queue; public static void main(String[] args) throws Exception { Connection conn ConnectionUtil.getConnection(); Channel channel conn.createChannel(); channel.queueDeclare(QUEUE, false, false, false, null); DeliverCallback callback (tag, msg) - { System.out.println(接收 new String(msg.getBody())); }; channel.basicConsume(QUEUE, true, callback, tag - {}); System.out.println(等待消息...); } }✅ 运行顺序必须先开消费者运行Consumer保持运行运行Producer消费者控制台打印消息四、项目 2work-demo 工作队列模式项目结构plaintextwork-demo ├── src/main/java/com/mq │ ├── util/ConnectionUtil.java │ ├── Producer.java │ ├── Consumer1.java │ └── Consumer2.java └── pom.xml完整代码生产者 Producer.javajava运行package com.mq; import com.mq.util.ConnectionUtil; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; public class Producer { private static final String QUEUE work_queue; public static void main(String[] args) throws Exception { Connection conn ConnectionUtil.getConnection(); Channel channel conn.createChannel(); channel.queueDeclare(QUEUE, false, false, false, null); // 发送10条消息 for (int i 1; i 10; i) { String msg 任务 i; channel.basicPublish(, QUEUE, null, msg.getBytes()); System.out.println(发送 msg); } ConnectionUtil.close(conn, channel); } }消费者 1 Consumer1.javajava运行package com.mq; import com.mq.util.ConnectionUtil; import com.rabbitmq.client.*; public class Consumer1 { private static final String QUEUE work_queue; public static void main(String[] args) throws Exception { Connection conn ConnectionUtil.getConnection(); Channel channel conn.createChannel(); channel.queueDeclare(QUEUE, false, false, false, null); DeliverCallback callback (tag, msg) - { System.out.println(消费者1接收 new String(msg.getBody())); }; channel.basicConsume(QUEUE, true, callback, tag - {}); } }消费者 2 Consumer2.javajava运行package com.mq; import com.mq.util.ConnectionUtil; import com.rabbitmq.client.*; public class Consumer2 { private static final String QUEUE work_queue; public static void main(String[] args) throws Exception { Connection conn ConnectionUtil.getConnection(); Channel channel conn.createChannel(); channel.queueDeclare(QUEUE, false, false, false, null); DeliverCallback callback (tag, msg) - { System.out.println(消费者2接收 new String(msg.getBody())); }; channel.basicConsume(QUEUE, true, callback, tag - {}); } }✅ 运行顺序运行Consumer1运行Consumer2运行Producer两个消费者轮流接收消息轮询分发五、项目 3fanout-demo 发布订阅模式项目结构plaintextfanout-demo ├── src/main/java/com/mq │ ├── util/ConnectionUtil.java │ ├── Producer.java │ ├── Consumer1.java │ └── Consumer2.java └── pom.xml完整代码生产者 Producer.javajava运行package com.mq; import com.mq.util.ConnectionUtil; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; public class Producer { private static final String EXCHANGE fanout_exchange; public static void main(String[] args) throws Exception { Connection conn ConnectionUtil.getConnection(); Channel channel conn.createChannel(); channel.exchangeDeclare(EXCHANGE, fanout); String msg 广播消息; channel.basicPublish(EXCHANGE, , null, msg.getBytes()); System.out.println(发送 msg); ConnectionUtil.close(conn, channel); } }消费者 1 Consumer1.javajava运行package com.mq; import com.mq.util.ConnectionUtil; import com.rabbitmq.client.*; public class Consumer1 { private static final String EXCHANGE fanout_exchange; public static void main(String[] args) throws Exception { Connection conn ConnectionUtil.getConnection(); Channel channel conn.createChannel(); channel.exchangeDeclare(EXCHANGE, fanout); String queue channel.queueDeclare().getQueue(); channel.queueBind(queue, EXCHANGE, ); DeliverCallback callback (tag, msg) - { System.out.println(消费者1接收 new String(msg.getBody())); }; channel.basicConsume(queue, true, callback, tag - {}); } }消费者 2 Consumer2.javajava运行package com.mq; import com.mq.util.ConnectionUtil; import com.rabbitmq.client.*; public class Consumer2 { private static final String EXCHANGE fanout_exchange; public static void main(String[] args) throws Exception { Connection conn ConnectionUtil.getConnection(); Channel channel conn.createChannel(); channel.exchangeDeclare(EXCHANGE, fanout); String queue channel.queueDeclare().getQueue(); channel.queueBind(queue, EXCHANGE, ); DeliverCallback callback (tag, msg) - { System.out.println(消费者2接收 new String(msg.getBody())); }; channel.basicConsume(queue, true, callback, tag - {}); } }✅ 运行顺序运行Consumer1运行Consumer2运行Producer两个消费者都收到同一条消息广播六、项目 4direct-demo 路由模式项目结构plaintextdirect-demo ├── src/main/java/com/mq │ ├── util/ConnectionUtil.java │ ├── Producer.java │ ├── ConsumerInfo.java │ └── ConsumerError.java └── pom.xml完整代码生产者 Producer.javajava运行package com.mq; import com.mq.util.ConnectionUtil; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; public class Producer { private static final String EXCHANGE direct_exchange; public static void main(String[] args) throws Exception { Connection conn ConnectionUtil.getConnection(); Channel channel conn.createChannel(); channel.exchangeDeclare(EXCHANGE, direct); // 发送不同路由键消息 channel.basicPublish(EXCHANGE, info, null, info日志.getBytes()); channel.basicPublish(EXCHANGE, error, null, error日志.getBytes()); ConnectionUtil.close(conn, channel); } }消费者 ConsumerInfo.javajava运行package com.mq; import com.mq.util.ConnectionUtil; import com.rabbitmq.client.*; public class ConsumerInfo { public static void main(String[] args) throws Exception { Connection conn ConnectionUtil.getConnection(); Channel channel conn.createChannel(); channel.exchangeDeclare(direct_exchange, direct); String queue channel.queueDeclare().getQueue(); channel.queueBind(queue, direct_exchange, info); channel.basicConsume(queue, true, (t, m) - { System.out.println(info接收 new String(m.getBody())); }, t - {}); } }消费者 ConsumerError.javajava运行package com.mq; import com.mq.util.ConnectionUtil; import com.rabbitmq.client.*; public class ConsumerError { public static void main(String[] args) throws Exception { Connection conn ConnectionUtil.getConnection(); Channel channel conn.createChannel(); channel.exchangeDeclare(direct_exchange, direct); String queue channel.queueDeclare().getQueue(); channel.queueBind(queue, direct_exchange, error); channel.basicConsume(queue, true, (t, m) - { System.out.println(error接收 new String(m.getBody())); }, t - {}); } }✅ 运行顺序运行ConsumerInfo运行ConsumerError运行Producer各自只收到对应路由键的消息七、项目 5topic-demo 主题模式完整代码项目结构plaintexttopic-demo ├── src/main/java/com/mq │ ├── util/ConnectionUtil.java │ ├── Producer.java │ ├── Consumer1.java │ └── Consumer2.java └── pom.xmlProducer.java生产者java运行package com.mq; import com.mq.util.ConnectionUtil; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; public class Producer { private static final String EXCHANGE topic_exchange; public static void main(String[] args) throws Exception { Connection conn ConnectionUtil.getConnection(); Channel channel conn.createChannel(); channel.exchangeDeclare(EXCHANGE, topic); // 发送两条带路由键的消息 channel.basicPublish(EXCHANGE, user.save, null, 用户新增.getBytes()); channel.basicPublish(EXCHANGE, order.pay, null, 订单支付.getBytes()); System.out.println(主题模式消息发送完成); ConnectionUtil.close(conn, channel); } }Consumer1.java匹配 user.#java运行package com.mq; import com.mq.util.ConnectionUtil; import com.rabbitmq.client.*; public class Consumer1 { private static final String EXCHANGE topic_exchange; public static void main(String[] args) throws Exception { Connection conn ConnectionUtil.getConnection(); Channel channel conn.createChannel(); channel.exchangeDeclare(EXCHANGE, topic); String queue channel.queueDeclare().getQueue(); // 绑定通配符匹配所有 user 开头的路由 channel.queueBind(queue, EXCHANGE, user.#); channel.basicConsume(queue, true, (tag, msg) - { System.out.println(消费者1(user.#) 接收 new String(msg.getBody())); }, tag - {}); } }Consumer2.java匹配 *.payjava运行package com.mq; import com.mq.util.ConnectionUtil; import com.rabbitmq.client.*; public class Consumer2 { private static final String EXCHANGE topic_exchange; public static void main(String[] args) throws Exception { Connection conn ConnectionUtil.getConnection(); Channel channel conn.createChannel(); channel.exchangeDeclare(EXCHANGE, topic); String queue channel.queueDeclare().getQueue(); // 绑定通配符匹配所有以 .pay 结尾的路由 channel.queueBind(queue, EXCHANGE, *.pay); channel.basicConsume(queue, true, (tag, msg) - { System.out.println(消费者2(*.pay) 接收 new String(msg.getBody())); }, tag - {}); } }✅ 运行顺序运行Consumer1运行Consumer2运行Producer结果消费者 1 收到用户新增消费者 2 收到订单支付八、项目 6headers-demo 首部匹配模式完整代码项目结构plaintextheaders-demo ├── src/main/java/com/mq │ ├── util/ConnectionUtil.java │ ├── Producer.java │ └── Consumer.java └── pom.xmlProducer.javajava运行package com.mq; import com.mq.util.ConnectionUtil; import com.rabbitmq.client.AMQP; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import java.util.Map; public class Producer { private static final String EXCHANGE headers_exchange; public static void main(String[] args) throws Exception { Connection conn ConnectionUtil.getConnection(); Channel channel conn.createChannel(); channel.exchangeDeclare(EXCHANGE, headers); // 设置消息头 AMQP.BasicProperties props new AMQP.BasicProperties.Builder() .headers(Map.of(type, sms)).build(); channel.basicPublish(EXCHANGE, , props, 短信消息.getBytes()); System.out.println(首部模式消息发送完成); ConnectionUtil.close(conn, channel); } }Consumer.javajava运行package com.mq; import com.mq.util.ConnectionUtil; import com.rabbitmq.client.*; import java.util.Map; public class Consumer { private static final String EXCHANGE headers_exchange; public static void main(String[] args) throws Exception { Connection conn ConnectionUtil.getConnection(); Channel channel conn.createChannel(); channel.exchangeDeclare(EXCHANGE, headers); String queue channel.queueDeclare().getQueue(); // 匹配headers任意一个满足即可 MapString, Object args Map.of(x-match, any, type, sms); channel.queueBind(queue, EXCHANGE, , args); channel.basicConsume(queue, true, (tag, msg) - { System.out.println(首部匹配消费者接收 new String(msg.getBody())); }, tag - {}); } }✅ 运行顺序运行Consumer运行Producer消费者收到短信消息九、项目 7delay-demo 延迟队列完整代码项目结构plaintextdelay-demo ├── src/main/java/com/mq │ ├── util/ConnectionUtil.java │ ├── Producer.java │ └── Consumer.java └── pom.xmlProducer.java生产者 —— 发送到过期队列java运行package com.mq; import com.mq.util.ConnectionUtil; import com.rabbitmq.client.AMQP; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import java.util.HashMap; import java.util.Map; public class Producer { // 过期队列消息在这里等待5秒 private static final String WAIT_QUEUE wait_queue; public static void main(String[] args) throws Exception { Connection conn ConnectionUtil.getConnection(); Channel channel conn.createChannel(); // 核心过期队列配置死信转发 MapString, Object params new HashMap(); // 消息过期时间 5秒 params.put(x-message-ttl, 5000); // 过期后转发到死信交换机 params.put(x-dead-letter-exchange, ); // 过期后路由到真正队列 params.put(x-dead-letter-routing-key, real_delay_queue); // 声明过期等待队列 channel.queueDeclare(WAIT_QUEUE, true, false, false, params); // 发送消息不设置expiration队列统一过期 String msg 我是延迟5秒的消息; channel.basicPublish(, WAIT_QUEUE, null, msg.getBytes()); System.out.println(已发送延迟消息等待5秒后到达消费者...); ConnectionUtil.close(conn, channel); } }Consumer.java消费者 —— 监听真正队列java运行package com.mq; import com.mq.util.ConnectionUtil; import com.rabbitmq.client.*; public class Consumer { // 真正消费的队列5秒后消息才会来 private static final String REAL_QUEUE real_delay_queue; public static void main(String[] args) throws Exception { Connection conn ConnectionUtil.getConnection(); Channel channel conn.createChannel(); // 声明真正的消费队列 channel.queueDeclare(REAL_QUEUE, true, false, false, null); System.out.println(延迟消费者已启动等待5秒后收到消息...); // 监听消费 channel.basicConsume(REAL_QUEUE, true, (tag, msg) - { System.out.println(✅ 收到延迟消息 new String(msg.getBody())); }, tag - {}); } }十、项目 8springboot-rabbitmq-demo完整代码pom.xmlxml?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version2.7.15/version /parent modelVersion4.0.0/modelVersion groupIdcom.mq/groupId artifactIdspringboot-rabbitmq-demo/artifactId version1.0/version dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-amqp/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency /dependencies /projectapplication.ymlyamlspring: rabbitmq: host: localhost port: 5672 username: guest password: guestRabbitApplication.java启动类java运行package com.mq; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; SpringBootApplication public class RabbitApplication { public static void main(String[] args) { SpringApplication.run(RabbitApplication.class, args); } }RabbitConfig.javajava运行package com.mq.config; import org.springframework.amqp.core.Queue; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; Configuration public class RabbitConfig { Bean public Queue queue(){ return new Queue(boot_queue); } }ProducerController.javajava运行package com.mq.controller; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; RestController public class ProducerController { Autowired private RabbitTemplate template; GetMapping(/send) public String send(){ template.convertAndSend(boot_queue, SpringBoot集成RabbitMQ消息); return 消息发送成功; } }Consumer.javajava运行package com.mq.consumer; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; Component public class Consumer { RabbitListener(queues boot_queue) public void receive(String msg){ System.out.println(SpringBoot消费者接收msg); } }✅ 运行顺序启动RabbitApplication浏览器访问http://localhost:8080/send控制台打印消息十一、项目 9rabbitmq-microservice-demo 微服务异步通信完整代码启动类 MicroApplication.javajava运行package com.mq.micro; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; SpringBootApplication public class MicroApplication { public static void main(String[] args) { SpringApplication.run(MicroApplication.class,args); } }配置类 RabbitMicroConfig.javajava运行package com.mq.micro.config; import org.springframework.amqp.core.Binding; import org.springframework.amqp.core.BindingBuilder; import org.springframework.amqp.core.DirectExchange; import org.springframework.amqp.core.Queue; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; Configuration public class RabbitMicroConfig { public static final String ORDER_EXCHANGE order_business_exchange; public static final String STOCK_QUEUE stock_reduce_queue; public static final String SMS_QUEUE sms_send_queue; public static final String ROUTING_STOCK order.stock; public static final String ROUTING_SMS order.sms; Bean public DirectExchange orderExchange(){ return new DirectExchange(ORDER_EXCHANGE,true,false); } Bean public Queue stockQueue(){ return new Queue(STOCK_QUEUE,true); } Bean public Queue smsQueue(){ return new Queue(SMS_QUEUE,true); } Bean public Binding stockBinding(){ return BindingBuilder.bind(stockQueue()).to(orderExchange()).with(ROUTING_STOCK); } Bean public Binding smsBinding(){ return BindingBuilder.bind(smsQueue()).to(orderExchange()).with(ROUTING_SMS); } }订单生产者 OrderProducer.javajava运行package com.mq.micro.order; import com.mq.micro.config.RabbitMicroConfig; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; RestController public class OrderProducer { Resource private RabbitTemplate rabbitTemplate; GetMapping(/create/order/{orderNo}) public String createOrder(PathVariable String orderNo){ String orderMsg 订单orderNo 支付完成; rabbitTemplate.convertAndSend(RabbitMicroConfig.ORDER_EXCHANGE, RabbitMicroConfig.ROUTING_STOCK,orderMsg); rabbitTemplate.convertAndSend(RabbitMicroConfig.ORDER_EXCHANGE, RabbitMicroConfig.ROUTING_SMS,orderMsg); return 订单创建成功消息已推送; } }库存消费者 StockConsumer.javajava运行package com.mq.micro.stock; import com.mq.micro.config.RabbitMicroConfig; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; Component public class StockConsumer { RabbitListener(queues RabbitMicroConfig.STOCK_QUEUE) public void reduceStock(String msg){ System.out.println(【库存微服务】收到msg); System.out.println(【库存微服务】执行商品库存扣减...); } }短信消费者 SmsConsumer.javajava运行package com.mq.micro.sms; import com.mq.micro.config.RabbitMicroConfig; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; Component public class SmsConsumer { RabbitListener(queues RabbitMicroConfig.SMS_QUEUE) public void sendSms(String msg){ System.out.println(【短信微服务】收到msg); System.out.println(【短信微服务】执行发送下单成功短信...); } }✅ 运行顺序启动RabbitMQ启动MicroApplication浏览器访问plaintexthttp://localhost:8080/create/order/ORDER20260520控制台输出plaintext【库存微服务】收到订单ORDER20260520 支付完成 【库存微服务】执行商品库存扣减... 【短信微服务】收到订单ORDER20260520 支付完成 【短信微服务】执行发送下单成功短信...十二、所有项目通用运行口诀零基础必背原生 Java 项目先运行消费者再运行生产者SpringBoot 项目直接启动访问接口即可多个消费者全部先启动再发消息交换机模式消费者必须先绑定队列

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

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…