5、Spring AI(MCPServer+MCPClient+Ollama)开发环境搭建_第一篇

前言:

该开发环境是在 3、后端持久化(SpringBoot3.5.0+MybatisPlus3.5.5+mysql8.4.0)环境搭建

上进行改造的,用到了后端持久化,主要改造的地方为数据库把email字段改为height(身高),该开发环境主要是设计了一个灌篮高手篮球经理对球队成员简单的查询,通过这个场景把MCPServer、MCPClient、大模型、用户客户端相互的职责和关系简单捋一下,其他的改造和实现一边贴代码一边解释

1、数据库表结构

数据库表结构以及数据初始化、user_info表

ET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- Table structure for user_info
-- ----------------------------
DROP TABLE IF EXISTS `user_info`;
CREATE TABLE `user_info`  (`id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'ID主键',`user_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '用户名',`sex` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '性别',`hobby` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '爱好',`special_skill` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '特长',`score` int(0) NULL DEFAULT NULL COMMENT '评分',`height` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '身高',PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of user_info
-- ----------------------------
INSERT INTO `user_info` VALUES ('3830a6dcd94e60e41e491a8701e10a48', '流川枫', '男', '睡觉', '大前锋', 98, '187cm');
INSERT INTO `user_info` VALUES ('463097bd7d06c7fbf709c40207c356c3', '牧绅一', '男', '未知', '后卫', 98, '184cm');
INSERT INTO `user_info` VALUES ('552cef7ea26dcb134623891417527cff', '樱木花道', '男', '赤木晴子', '大前锋', 97, '188cm');
INSERT INTO `user_info` VALUES ('6ebee37985f6cdf0ff6e7520c5441616', '仙道彰', '男', '钓鱼', '小前锋', 98, '190cm');
INSERT INTO `user_info` VALUES ('716bd21e54e5964058e4b9ad78cbaca3', '宫城良田', '男', '井上彩子', '后卫', 96, '168cm');
INSERT INTO `user_info` VALUES ('821a92f51a87be2d5d052e10a7223e70', '三井寿', '男', '三分球', '小前锋', 98, '184cm');
INSERT INTO `user_info` VALUES ('9f5553b0b67821bae5b5869fc8ff3a69', '赤木晴子', '女', '篮球迷', '啦啦队', 60, '156cm');
INSERT INTO `user_info` VALUES ('af2ab75e939b5cff8a95569b306be911', '井上彩子', '女', '宫城良田', '篮球经理', 70, '163cm');
INSERT INTO `user_info` VALUES ('d3f967929558b8c834396dd8aaa24e24', '泽北荣治', '男', '打篮球', '小前锋', 98, '186cm');
INSERT INTO `user_info` VALUES ('e6bf09db5717d9c60af41c9dde65f0d6', '赤木刚宪', '男', '吃香蕉', '中锋', 97, '199cm');SET FOREIGN_KEY_CHECKS = 1;

该表中存储了一些球员的基本信息,以便篮球经理查看

2、MCPServer搭建

(1)pom.xml文件

该文件在之前  3、后端持久化(SpringBoot3.5.0+MybatisPlus3.5.5+mysql8.4.0)环境搭建

的基础上改动不多,整体如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.everything.autotest</groupId><artifactId>spring_ai_project</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><java.version>17</java.version><spring-boot.version>3.5.0</spring-boot.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.5.0</version></parent><dependencies><!-- mcp-server-webmvc --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-mcp-server-webmvc</artifactId><version>1.0.0</version></dependency><!-- Web 模块 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!-- MyBatisPlus --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>3.5.5</version></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId></dependency><!-- Selenium WebDriver --><dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>4.31.0</version></dependency><!-- WebDriver Manager --><dependency><groupId>io.github.bonigarcia</groupId><artifactId>webdrivermanager</artifactId><version>6.1.0</version></dependency><!-- SLF4J API --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>2.0.9</version></dependency><!-- Log4j2核心实现包 --><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.24.3</version></dependency><!-- SLF4J与Log4j2的桥接器 --><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-slf4j2-impl</artifactId><version>2.24.3</version><exclusions><exclusion><artifactId>log4j-core</artifactId><groupId>org.apache.logging.log4j</groupId></exclusion></exclusions></dependency></dependencies></project>

只增加了一个MCPServer的必须文件,注意版本号,使用当前最新版本Spring AI 1.0.0,如下:

<!-- mcp-server-webmvc -->
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-mcp-server-webmvc</artifactId><version>1.0.0</version>
</dependency>

(2)application.yml文件

文件加入了Spring AI所需要的最简参数,整体application.yml如下:

server:port: 9091
spring:ai:mcp:server:name: slamdunk-mcp-serverversion: 1.0.0sse-endpoint: /sse/slamdunk-mcp-serverdatasource:url: jdbc:mysql://localhost:3306/everythingtest?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8username: rootpassword: 1234driver-class-name: com.mysql.cj.jdbc.Driverdebug: true
mybatis-plus:mapper-locations: classpath:mapper/*.xmlglobal-config:db-config:id-type: ASSIGN_UUIDfield-strategy: NOT_EMPTYdb-type: MYSQLconfiguration:map-underscore-to-camel-case: truecall-setters-on-nulls: truelog-impl: org.apache.ibatis.logging.stdout.StdOutImpl

MCPServer的yml文件配置唯一注意的一点就是sse-endpoint: /sse/slamdunk-mcp-server

sse-endpoint这个参数需要在代码里做一些特殊处理才能生效,处理完成后MCPClient调用时才不会报404错误

(3)java文件

UserInfoMCPServerFacade.java

package com.everything.autotest.demo.mcpserverdemo;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.everything.autotest.demo.mybatisplus3demo.UserInfo;
import com.everything.autotest.demo.mybatisplus3demo.userinfo.UserInfoService;
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.annotation.ToolParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class UserInfoMCPServerFacade {@AutowiredUserInfoService userInfoService;@Tool(name = "getInfo", description = "根据球员姓名获取某个球员的详细信息")public UserInfo getInfo(@ToolParam(description = "球员姓名") String userName) throws Exception {var userInfoQueryWrapper = new QueryWrapper<UserInfo>();userInfoQueryWrapper.like("user_name", userName);return userInfoService.getOne(userInfoQueryWrapper);}@Tool(name = "getList", description = "获取所有球员信息")public List<UserInfo> getList() {return userInfoService.list();}
}

做一个简单解释:

1、简单的可以理解为这个类相当于之前的Controller层,之前的Controller层的参数是从页面或者第三方的restful调用过来,现在改为从MCPClient客户端调用;调过来之后,后面处理的逻辑不变,依然是调用UserInfoService层来查询数据库和处理逻辑并返回到UserInfoMCPServerFacade

2、为什么这个类名后缀起成Facade,因为目前也没啥标准规范,个人理解是,如果起名成Controller感觉有点怪怪的,如果起名成Service又和对应持久化层的Service有点混淆,所以干脆起成门面(Facade),这样也有面子。

3、关于注解,及api使用方法会在后面更细节的分析,这篇先把运行环境搭起来

SlamDunkMCPRegisterConfiguration.java

package com.everything.autotest.demo.mcpserverdemo;import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.ai.tool.method.MethodToolCallbackProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class SlamDunkMCPRegisterConfiguration {@Beanpublic ToolCallbackProvider userInfoTools(UserInfoMCPServerFacade userInfoMCPServerFacade){return MethodToolCallbackProvider.builder().toolObjects(userInfoMCPServerFacade).build();}
}

把UserInfoMCPServerFacade搞进来

SlamDunkMCPServerConfig.java

package com.everything.autotest.demo.mcpserverdemo;import com.fasterxml.jackson.databind.ObjectMapper;
import io.modelcontextprotocol.server.transport.WebMvcSseServerTransportProvider;
import org.springframework.ai.mcp.server.autoconfigure.McpServerProperties;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.web.servlet.function.RouterFunction;
import org.springframework.web.servlet.function.ServerResponse;@Configuration
public class SlamDunkMCPServerConfig {@Bean@Primarypublic WebMvcSseServerTransportProvider webMvcSseServerTransportProvider(ObjectProvider<ObjectMapper> objectMapperProvider, McpServerProperties serverProperties) {ObjectMapper objectMapper = objectMapperProvider.getIfAvailable(ObjectMapper::new);return new WebMvcSseServerTransportProvider(objectMapper, serverProperties.getSseMessageEndpoint(),serverProperties.getSseEndpoint());}@Beanpublic RouterFunction<ServerResponse> mvcMcpRouterFunction(WebMvcSseServerTransportProvider transportProvider) {return transportProvider.getRouterFunction();}}

SlamDunkMCPServerConfig.java这个类完全就是为了让sse-endpoint这个参数生效,其实可以不配sse-endpoint这个参数也行,但是感觉配出来高大上一点;

通过以上配置MCPServer就搭建完毕了,运行起来,浏览器输入

http://localhost:9091/sse/slamdunk-mcp-server

如果界面是这样,说明mcpServer配置成功

MCPServer搭建成功

3、MCPClient搭建

MCPClient和MCPServer是两个不同的工程,最好不要写在一个工程里分两个Model,这样容易串端口

在这之前,首先参考  4、大模型本地运行环境搭建 把本地大模型搭起来

然后浏览器输入 http://localhost:11434/ 如果显示下图,则说明大模型运行成功

(1)pom.xml文件

文件必要依赖如下:

<!-- mcp-client -->
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-mcp-client</artifactId>
</dependency>
<!-- 使用的大模型依赖 -->
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-ollama</artifactId>
</dependency>
<dependencyManagement><dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>1.0.0</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>

以上配置我不确定能不能生效,因为对于Client配置我改了很多次,又没有重新install可能会有缓存,如果不生效或者有问题,请参考Server的配置,把版本号显示写

还是要注意:Spring AI的版本号一定要选1.0.0版本,当前最新版

(2)application.yml文件

server:port: 9100
spring:ai:ollama:base-url: http://localhost:11434chat:model: llama3.2mcp:client:enabled: truename: slamdunk-mcp-clientversion: 1.0.0
#        request-timeout: 30stype: syncsse:connections:server1:url: http://localhost:9091sse-endpoint: /sse/slamdunk-mcp-servertoolcallback:enabled: true

这里的sse-endpoint: /sse/slamdunk-mcp-server与服务器保持一致(注意:一定要用1.0.0版,别用M版本

(3)java文件

SlamDunkClientConfig.java

package com.gempharmatech.mcpclient;import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import org.springframework.ai.ollama.OllamaChatModel;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class SlamDunkClientConfig {@Autowiredprivate OllamaChatModel ollamaChatModel;@Autowiredprivate ToolCallbackProvider toolCallbackProvider;@Beanpublic ChatClient chatClient() {StringBuilder sb = new StringBuilder();sb.append("你是一个篮球经理,需要对篮球队内的一切事务所处判断和决策。");sb.append("根据球员姓名获取某个球员的详细信息。");sb.append("获取所有球员信息。");sb.append("最后,可以通过诙谐幽默的方式回答出问题,重点是诙谐幽默,可以允许你自由发挥");return ChatClient.builder(ollamaChatModel).defaultSystem(sb.toString()).defaultAdvisors(new SimpleLoggerAdvisor()).defaultToolCallbacks(toolCallbackProvider).build();}
}
 

SlamDunkMCPClintController.java 

package com.gempharmatech.mcpclient;import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.annotation.Resource;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;@RestController
public class SlamDunkMCPClintController {@Resourceprivate ObjectMapper objectMapper;@Resourceprivate ChatClient chatClient;@PostMapping("/slamdunk/gogogo")public String getInfo(@RequestBody String jsonData) throws Exception {var node = objectMapper.readTree(jsonData);var message = node.get("message").asText();return chatClient.prompt().user(message).call().content();}
}

MCPClient搭建成功

4、整体测试各种场景

首先:说明一下UserInfoService中的两个查询方法

(1)数据库列表全查,调用MybatisPlus封装好的list()接口全查

(2)根据userName模糊查询

(1)postman中输入"把球员名字叫流川枫的信息诙谐幽默的展示一下"

感觉还行,这个大模型呆萌呆萌的

(2)postman中输入"查询分数排名前五的球员信息,每个人的信息一行展示"

从这个结果看,大模型虽然只返回给5条,但是并没有按照分数最高的5个人返回,这一点可以在后面优化,让大模型能更深入的理解返回正确结果

(3)postman中输入"查询性别是女性的球员信息,每个人的信息一行展示"

这个怎么说呢,大模型开起车来也是棒棒的,其实这个llama3.2大模型才2G,另外就是给大模型的指令可以更精细化,后面文章会讲到,当前能做到这样已经很不错了,主要是萌新,后期会换个厉害点的模型

以上就是Spring AI(MCPServer+MCPClient+Ollama)开发环境搭建的第一篇,搭建完毕,大家也大致了解几个组件之间的调用顺序和配合关系了吧,下期见

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

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

相关文章

个典型的 Java 泛型在反序列化场景下“类型擦除 + 无法推断具体类型”导致的隐性 Bug

今天遇到一个问题&#xff1a;一个典型的 Java 泛型在反序列化场景下“类型擦除 无法推断具体类型”导致的隐性 Bug&#xff0c;尤其是在 RPC&#xff08;如 Dubbo、Feign 等&#xff09;和 本地 JVM 内直连调用共存时&#xff0c;这种问题会显现得非常明显。 A 服务暴露了一…

开发指南121-微服务的弹性伸缩

平台的后台服务表现形式就是各种各样的微服务。微服务可以部署在不同的机器上。单一服务的伸缩很简单&#xff1a; 部署在不同机器上&#xff0c;直接启动关闭即可。 部署在同一机器上&#xff0c;可以复制为多个不同目录&#xff0c;其中jar包&#xff0c;启动文件是完全一样…

【C++特殊工具与技术】优化内存分配(六):运行时类型识别

目录 一、RTTI 的核心机制与设计背景 1.1 RTTI 的设计目标 1.2 RTTI 的启动条件 二、dynamic_cast&#xff1a;动态类型转换 2.1 语法与核心特性 2.2 转换场景详解 2.3 引用类型转换与异常处理 2.4 性能注意事项 三、typeid&#xff1a;类型信息查询 3.1 语法与核心特…

USB串口通信、握手协议、深度学习等技术要点

基于OpenMV的智能车牌识别系统&#xff1a;从硬件到算法的完整实现 前言 本文将详细介绍一个基于OpenMV微控制器的智能车牌识别系统的设计与实现。该系统集成了嵌入式视觉处理、串口通信协议、深度学习OCR识别等多种技术&#xff0c;实现了从图像采集到车牌识别的完整流程。 …

猎板PCB:手机主板pcb需要做哪些可靠性测试

在智能手机高度普及的今天&#xff0c;一块指甲盖大小的主板承载着通信、计算、影像等核心功能。当消费者为新机性能欢呼时&#xff0c;鲜少有人关注到主板PCB&#xff08;印刷电路板&#xff09;在幕后经历的严苛考验。这些隐藏在金属外壳下的精密线路&#xff0c;需要经过多轮…

Java并发编程实战 Day 21:分布式并发控制

【Java并发编程实战 Day 21】分布式并发控制 文章简述&#xff1a; 在高并发和分布式系统中&#xff0c;传统的线程级锁已无法满足跨节点的同步需求。本文深入讲解了分布式并发控制的核心概念与技术方案&#xff0c;包括分布式锁、一致性算法&#xff08;如Paxos、Raft&#x…

C语言文件操作与预处理详解

目录 文件操作文件基本概念文件指针文件打开模式文件读取操作字符读取字符串读取格式化读取二进制读取 文件写入操作字符写入字符串写入格式化写入二进制写入 文件定位操作文件错误处理 预处理预处理基本概念常见预处理指令文件包含指令宏定义简单宏带参数的宏字符串化操作符(#…

水库大坝安全监测之渗流监测

水库大坝的渗流状况直接关系到其结构稳定性与安全运行。渗流可能引发坝体内部土体的渗透变形&#xff0c;如管涌、流土等现象&#xff0c;削弱坝体强度&#xff0c;严重时甚至导致大坝垮塌&#xff0c;威胁下游人民生命财产安全。通过渗流监测&#xff0c;能够实时掌握坝体及坝…

windows使用命令行查看进程信息

在 Windows 操作系统中&#xff0c;您可以使用多种命令行工具来查看进程信息。以下是几种常用方法&#xff1a; 1. 使用 tasklist 命令&#xff08;最常用&#xff09; 查看所有进程的基本信息&#xff1a; tasklist输出示例&#xff1a; 映像名称 PID…

【C#】多级缓存与多核CPU

多级缓存&#xff08;如CPU的L1/L2/L3缓存&#xff09;与多核处理器之间存在紧密的协同与竞争关系&#xff0c;直接影响系统性能。以下是关键影响及优化策略&#xff1a; 一、缓存层级与多核的协作机制 缓存结构 L1缓存 私有缓存&#xff1a;每个CPU核心独享&#xff0c;容量小…

PostgreSQL的扩展adminpack

PostgreSQL的扩展adminpack adminpack 是 PostgreSQL 提供的一个管理扩展&#xff0c;它包含多个实用函数&#xff0c;帮助数据库管理员执行文件系统操作和维护任务。这个扩展通常由数据库超级用户使用&#xff0c;提供了一些服务器端的文件访问功能。 一、adminpack 扩展概述…

Unity | AmplifyShaderEditor插件基础(第九集:旗子进阶版)

目录 一、&#x1f44b;&#x1f3fb;前言 二、准备工作 1.下载安装插件ProBuilder 2.下载安装插件Polybrush 3.固定原理 4.旗子 三、顶点上色 1.创建一个可以顶点上色的材质 2.开始上色 a.上色功能说明 b.全部上色 c.调整刷子 四、shader的设置 1.幅度添加 2.顶…

Java 实现 Excel 转化为 PDF

引言 在实际开发中&#xff0c;将 Excel 文件转化为 PDF 格式是一项常见需求。例如在需要共享数据报表时&#xff0c;PDF 格式具有更好的兼容性和安全性。GrapeCity Documents for Excel&#xff08;GcExcel&#xff09;为 Java 开发者提供了强大的工具&#xff0c;可轻松实现…

Spring Boot3批式访问Dify聊天助手接口

Spring Boot3批式访问Dify聊天助手接口 前言 之前已经配置好Dify1.4.1及LM Studio集成&#xff1a; https://lizhiyong.blog.csdn.net/article/details/148607462 现在就可以借助Spring Boot3去访问Dify的后端接口&#xff0c;让前端展示大模型的返回内容。这是我等大数据资…

事务传播行为详解

一、事务传播行为的基本概念 事务传播行为是Spring 框架中事务管理的核心概念&#xff0c;用于定义当一个事务方法被另一个事务方法调用时&#xff0c;事务应如何传播。通俗地说&#xff0c;它解决了 “多个事务方法嵌套调用时&#xff0c;新方法是加入现有事务还是创建新事务…

Java八股文——Spring「SpringMVC 篇」

MVC分层介绍一下 面试官您好&#xff0c;MVC是一种非常经典、影响深远的软件设计模式&#xff0c;它的全称是Model-View-Controller。在我看来&#xff0c;它的核心目标就是解决早期Web开发中&#xff0c;业务逻辑、数据和界面显示高度耦合的问题&#xff0c;从而实现“各司其…

FreeSWITCH mod_curl 和 mod_xml_rpc 测试

编辑 /usr/local/freeswitch/conf/autoload_configs/xml_rpc.conf.xml <configuration name"xml_rpc.conf" description"XML RPC"> <settings> <param name"http-port" value"8889"/> <param name&quo…

实时监控、秒级决策:镜舟科技如何重塑融资融券业务数据处理模式

融资融券业务作为证券市场的重要组成部分&#xff0c;已成为金融机构核心业务增长点和利润来源。截至 2023 年底&#xff0c;我国融资融券余额已突破 1.8 万亿元&#xff0c;业务量呈现爆发式增长。然而&#xff0c;在业务高速发展的同时&#xff0c;金融机构面临着数据处理效率…

Linux与量子计算:面向未来的架构演进

Linux与量子计算&#xff1a;面向未来的架构演进 当经典计算遇上量子革命 引言&#xff1a;量子计算时代的黎明 量子计算正从理论走向工程实践&#xff0c;Linux作为现代计算的基石&#xff0c;正在量子革命中扮演关键角色。据IBM预测&#xff0c;到2027年&#xff0c;量子优势…

Java中wait()为何必须同步调用?

在 Java 中&#xff0c;wait() 方法必须在 synchronized 方法或代码块中调用&#xff0c;主要原因如下&#xff1a; 1. 监视器锁&#xff08;Monitor&#xff09;机制 依赖对象锁&#xff1a;wait() 方法需要操作对象的监视器锁&#xff08;Monitor&#xff09;&#xff0c;调…