发布时间:2026/9/1 4:36:00
Java Agent开发实战:从零构建具备感知决策执行能力的智能体 在实际 Java 项目向智能化演进的过程中Agent智能体开发正从一个前沿概念转变为一项可落地的工程实践。许多具备扎实 Java 背景的开发者在面对 Agent 开发时常常感到困惑它和传统的微服务、定时任务或规则引擎有何不同从面向对象编程到智能体编程思维模式需要如何转换更重要的是如何利用现有的 Java 技术栈快速构建一个具备感知、决策和执行能力的 Agent并确保其稳定运行本文旨在为 Java 开发者提供一个从零到一的 Agent 开发实战指南我们将不讨论任何抽象的理论框架而是聚焦于如何用 Java 代码实现一个具备核心能力的 Agent并解决开发中必然会遇到的环境配置、内存管理、框架选型、错误处理等实际问题。无论你是希望为现有系统增加智能调度能力还是探索新的技术方向这篇文章都将提供一条清晰的、可复现的路径。1. 理解 Agent 的核心概念从对象到智能体在深入代码之前必须厘清 Agent 在软件开发语境下的确切含义这有助于我们建立正确的技术模型避免将其与普通服务或工具类混淆。1.1 Agent 是什么不是什么一个软件 Agent 通常被定义为一个驻留在特定环境中的计算实体它能够感知环境Perception根据内部状态和目标进行自主决策Decision并执行动作Action以影响环境从而趋向于完成其设计目标。关键在于“自主性”和“目标导向”。它不是简单的 CRUD 服务一个只提供增删改查接口的 RESTful 服务被动响应请求没有持续的内部状态和主动的目标追求因此不是 Agent。它不是定时任务Cron Job定时任务在固定时间点触发固定逻辑缺乏对环境变化的感知和基于感知的动态决策能力。它也不是规则引擎Rule Engine规则引擎根据预置的 IF-THEN 规则进行推理虽然具备一定决策能力但其规则是静态配置的缺乏学习、记忆和长期目标规划的能力。一个典型的 Agent 更像是一个虚拟的“员工”或“机器人”。例如一个电商库存预警 Agent它会持续监控库存数据库感知当某商品库存低于阈值时内部状态变化它的目标是“维持库存健康”。为此它可能决策“生成采购单”并执行调用采购系统 API 的动作。1.2 Agent 的关键组件与 Java 映射要将这个概念落地到 Java 项目我们需要将其组件映射为具体的代码模块感知器Perceptor负责从数据源数据库、消息队列、API、文件获取信息。在 Java 中这可以是一个实现了Runnable或ScheduledExecutorService的类定期执行数据拉取或是使用Spring Integration、Apache Camel的消息监听器。记忆/状态Memory/State存储 Agent 对世界的理解、历史交互和当前目标。Java 中可以用类的成员变量、ConcurrentHashMap、嵌入式数据库如 H2、MapDB或 Redis 等外部存储来实现。决策引擎Decision Engine基于感知到的信息和内部状态决定下一步做什么。这可以是简单的if-else或switch逻辑、状态机如 Spring State Machine、更复杂的规划算法如 BFS、A*或集成一个轻量级规则引擎如 Drools。执行器Executor负责执行决策产生的动作如调用外部 HTTP 接口、发送消息、写入数据库、执行命令行操作。通常封装为独立的Service类。学习器Learner可选使 Agent 能够根据历史结果优化其决策。在入门阶段我们可以暂不实现复杂的机器学习但可以设计反馈循环例如根据动作的成功/失败率来调整决策阈值。理解这些组件后一个 Java Agent 的骨架就清晰了它是一个长期运行的、拥有内部状态的、能主动调度感知-决策-执行循环的 Java 进程。2. 搭建 Java Agent 开发环境与基础项目在开始编写 Agent 逻辑之前一个稳定且配置正确的开发环境是基础。我们将使用 Maven 管理依赖并确保 Lombok 等工具链正常工作避免在后续开发中被环境问题干扰。2.1 基础环境准备与验证首先确保你的 Java 开发环境符合要求。Agent 通常是长期运行的服务对 JVM 的稳定性有一定要求。组件要求验证命令说明JDKJDK 8 或以上推荐 JDK 11/17 LTSjava -version长期支持版更稳定。确保JAVA_HOME环境变量已正确设置。Maven3.6mvn -v用于项目构建和依赖管理。IDEIntelliJ IDEA / Eclipse-推荐使用 IntelliJ IDEA其对 Lombok 和现代 Java 支持更好。关键排查点Java 环境变量配置如果遇到‘java‘ 不是内部或外部命令说明环境变量PATH未包含 JDK 的bin目录。需要将%JAVA_HOME%\binWindows或$JAVA_HOME/binLinux/Mac添加到系统的PATH变量中。JAVA_HOME变量应指向 JDK 的安装根目录例如C:\Program Files\Java\jdk-17。2.2 创建 Maven 项目与核心依赖我们创建一个基础的 Spring Boot 项目作为起点因为它提供了便捷的依赖管理、配置和打包方式。即使你的 Agent 不一定是 Web 服务Spring Boot 的Scheduled、事件监听、外部化配置等特性也极其有用。使用 Spring Initializr 或 IDE 创建项目选择Project: MavenLanguage: JavaSpring Boot: 2.7.x 或 3.x注意依赖兼容性Packaging: JarJava Version: 11 或 17在pom.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 https://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version2.7.18/version !-- 选择一个稳定的版本 -- relativePath/ /parent groupIdcom.example/groupId artifactIdjava-agent-demo/artifactId version0.0.1-SNAPSHOT/version namejava-agent-demo/name descriptionDemo project for Java Agent Development/description properties java.version11/java.version /properties dependencies !-- Spring Boot 基础启动器 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter/artifactId /dependency !-- 计划任务支持用于驱动Agent循环 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-quartz/artifactId /dependency !-- 或使用更轻量的 Scheduled -- !-- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter/artifactId /dependency -- !-- 用于HTTP请求的执行器 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-webflux/artifactId !-- 或使用 webclient -- /dependency !-- 简化POJO开发 -- dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency !-- 测试 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-test/artifactId scopetest/scope /dependency /dependencies build plugins plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId configuration excludes exclude groupIdorg.projectlombok/groupId artifactIdlombok/artifactId /exclude /excludes /configuration /plugin /plugins /build /project关于 Lombok 的常见错误如果你在编译时遇到“Java: You aren‘t using a compiler supported by lombok...”错误通常是因为 IDE 没有启用 Lombok 注解处理。在 IntelliJ IDEA 中需要进入Settings - Build, Execution, Deployment - Compiler - Annotation Processors勾选Enable annotation processing。同时确保 Lombok 插件已安装。2.3 项目结构设计一个清晰的包结构有助于管理 Agent 的各个组件。建议采用如下结构src/main/java/com/example/agent/ ├── AgentApplication.java # Spring Boot 主类 ├── core/ │ ├── Agent.java # Agent 抽象基类或接口定义生命周期 │ ├── SimpleAgent.java # 具体 Agent 实现 │ ├── perception/ │ │ ├── Perceptor.java # 感知器接口 │ │ └── impl/ │ │ └── DatabasePerceptor.java # 数据库感知实现 │ ├── memory/ │ │ ├── Memory.java # 记忆/状态接口 │ │ └── impl/ │ │ └── InMemoryState.java # 基于内存的状态管理 │ ├── decision/ │ │ ├── DecisionEngine.java # 决策引擎接口 │ │ └── impl/ │ │ └── RuleBasedEngine.java # 基于规则的决策 │ └── action/ │ ├── Executor.java # 执行器接口 │ └── impl/ │ └── HttpActionExecutor.java # HTTP动作执行器 ├── config/ │ └── AgentConfig.java # Agent 相关配置如调度周期 └── service/ └── AgentSchedulerService.java # 负责启动和管理Agent线程/任务这个结构将 Agent 的核心组件模块化符合单一职责原则便于测试和扩展。3. 实现一个最小可运行的监控 Agent我们以一个具体的“网站健康检查 Agent”为例它定期检查指定网站是否可访问如果不可访问则发送警报这里用日志模拟。这个例子涵盖了感知HTTP 请求、决策状态判断、执行记录日志的完整循环。3.1 定义核心组件接口首先定义组件的通用接口为后续扩展打下基础。// core/perception/Perceptor.java package com.example.agent.core.perception; /** * 感知器接口。 * param T 感知结果的数据类型 */ public interface PerceptorT { /** * 执行一次感知从环境中获取信息。 * return 感知到的数据 */ T perceive(); }// core/decision/DecisionEngine.java package com.example.agent.core.decision; import com.example.agent.core.memory.Memory; /** * 决策引擎接口。 * param P 感知结果类型 * param A 动作类型 */ public interface DecisionEngineP, A { /** * 基于当前记忆和最新感知结果做出决策。 * param memory 当前记忆/状态 * param perception 最新感知结果 * return 决策出的动作如果无需动作可返回null */ A decide(Memory memory, P perception); }// core/action/Executor.java package com.example.agent.core.action; /** * 执行器接口。 * param A 动作类型 */ public interface ExecutorA { /** * 执行一个动作。 * param action 要执行的动作 * return 执行结果成功/失败、输出信息等 */ ExecutionResult execute(A action); } // 简单的执行结果封装 class ExecutionResult { private boolean success; private String message; // 省略构造器、getter、setter }// core/memory/Memory.java package com.example.agent.core.memory; /** * Agent的记忆/状态接口。 */ public interface Memory { // 可以定义一些通用的状态存取方法例如 // void update(String key, Object value); // Object retrieve(String key); // 本例中我们简化处理具体Agent自行定义状态结构。 }3.2 实现网站健康检查的具体组件现在我们为网站健康检查 Agent 实现具体的组件。1. 感知器发起 HTTP 请求检查网站状态// core/perception/impl/WebsiteHealthPerceptor.java package com.example.agent.core.perception.impl; import com.example.agent.core.perception.Perceptor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; import org.springframework.web.reactive.function.client.WebClient; import reactor.core.publisher.Mono; Component Slf4j public class WebsiteHealthPerceptor implements PerceptorBoolean { private final WebClient webClient; private final String targetUrl https://www.example.com; // 应配置化 public WebsiteHealthPerceptor(WebClient.Builder webClientBuilder) { this.webClient webClientBuilder.build(); } Override public Boolean perceive() { try { // 发送HEAD请求只检查响应状态节省带宽 HttpStatus status webClient.head() .uri(targetUrl) .retrieve() .toBodilessEntity() .map(response - response.getStatusCode()) .onErrorResume(e - { log.warn(感知网站状态失败: {}, e.getMessage()); return Mono.just(HttpStatus.SERVICE_UNAVAILABLE); }) .block(); // 在调度线程中阻塞是OK的生产环境可考虑异步 return status.is2xxSuccessful() || status.is3xxRedirection(); } catch (Exception e) { log.error(感知过程发生异常, e); return false; } } }2. 决策引擎根据健康状态决定是否报警// core/decision/impl/HealthCheckDecisionEngine.java package com.example.agent.core.decision.impl; import com.example.agent.core.decision.DecisionEngine; import com.example.agent.core.memory.Memory; import org.springframework.stereotype.Component; Component public class HealthCheckDecisionEngine implements DecisionEngineBoolean, String { // 简单的决策逻辑如果感知到不健康false则决策为“发送警报” Override public String decide(Memory memory, Boolean isHealthy) { if (Boolean.FALSE.equals(isHealthy)) { return SEND_ALERT; } return null; // 健康则无需动作 } }3. 执行器模拟发送警报记录错误日志// core/action/impl/LogAlertExecutor.java package com.example.agent.core.action.impl; import com.example.agent.core.action.Executor; import com.example.agent.core.action.ExecutionResult; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; Component Slf4j public class LogAlertExecutor implements ExecutorString { Override public ExecutionResult execute(String action) { if (SEND_ALERT.equals(action)) { log.error([Agent Alert] 目标网站健康检查失败需要人工介入检查。); return new ExecutionResult(true, 警报日志已记录); } return new ExecutionResult(false, 未知动作类型: action); } }4. Agent 记忆/状态记录连续失败次数// core/memory/impl/HealthCheckMemory.java package com.example.agent.core.memory.impl; import com.example.agent.core.memory.Memory; import lombok.Data; import org.springframework.stereotype.Component; Component Data public class HealthCheckMemory implements Memory { // 记录连续失败的次数用于更复杂的决策如失败3次才报警 private int consecutiveFailures 0; // 上次检查是否健康 private Boolean lastHealthStatus null; }3.3 组装 Agent 并驱动执行循环创建一个具体的 Agent 类将上述组件组装起来并提供一个runOneCycle方法执行一次“感知-决策-执行”循环。// core/SimpleHealthCheckAgent.java package com.example.agent.core; import com.example.agent.core.action.ExecutionResult; import com.example.agent.core.action.Executor; import com.example.agent.core.decision.DecisionEngine; import com.example.agent.core.memory.Memory; import com.example.agent.core.perception.Perceptor; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; Component Slf4j RequiredArgsConstructor public class SimpleHealthCheckAgent { private final PerceptorBoolean websiteHealthPerceptor; private final DecisionEngineBoolean, String healthCheckDecisionEngine; private final ExecutorString logAlertExecutor; private final HealthCheckMemory memory; // 使用具体实现类注入 /** * 执行Agent的一个完整工作周期。 */ public void runOneCycle() { log.debug(开始执行健康检查Agent周期...); // 1. 感知 Boolean isHealthy websiteHealthPerceptor.perceive(); log.debug(感知结果: 网站健康状态 {}, isHealthy); // 2. 更新记忆 (简单逻辑更新连续失败次数) if (Boolean.FALSE.equals(isHealthy)) { memory.setConsecutiveFailures(memory.getConsecutiveFailures() 1); } else { memory.setConsecutiveFailures(0); // 成功则重置 } memory.setLastHealthStatus(isHealthy); // 3. 决策 (可以基于记忆做更复杂的决策这里仍用简单逻辑) String action healthCheckDecisionEngine.decide(memory, isHealthy); // 4. 执行 if (action ! null) { log.debug(决策结果: 需要执行动作 - {}, action); ExecutionResult result logAlertExecutor.execute(action); log.debug(执行结果: {}, result.getMessage()); } else { log.debug(决策结果: 本次无需执行动作。); } log.debug(健康检查Agent周期执行完毕。连续失败次数: {}, memory.getConsecutiveFailures()); } }最后我们需要一个调度服务定期触发 Agent 的执行循环。这里使用 Spring 的Scheduled注解。// service/AgentSchedulerService.java package com.example.agent.service; import com.example.agent.core.SimpleHealthCheckAgent; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; Service EnableScheduling // 在主应用类上添加亦可 Slf4j RequiredArgsConstructor public class AgentSchedulerService { private final SimpleHealthCheckAgent healthCheckAgent; // 每5分钟执行一次 Scheduled(fixedDelay 5 * 60 * 1000) public void scheduleHealthCheck() { log.info(调度健康检查Agent任务...); try { healthCheckAgent.runOneCycle(); } catch (Exception e) { log.error(执行Agent任务时发生未捕获异常, e); // 生产环境应考虑更完善的错误处理如重试、熔断、通知等 } } }在AgentApplication主类上添加EnableScheduling。import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableScheduling; SpringBootApplication EnableScheduling public class AgentApplication { public static void main(String[] args) { SpringApplication.run(AgentApplication.class, args); } }3.4 运行与验证启动应用运行AgentApplication的main方法。观察日志应用启动后每隔 5 分钟你应该能看到类似以下的日志输出... 调度健康检查Agent任务... ... 开始执行健康检查Agent周期... ... 感知结果: 网站健康状态 true ... 决策结果: 本次无需执行动作。 ... 健康检查Agent周期执行完毕。连续失败次数: 0模拟故障你可以临时修改WebsiteHealthPerceptor中的targetUrl为一个不存在的地址如https://www.nonexistent-site-xyz.com观察下一个周期是否会触发警报日志。验证记忆功能连续几次失败后检查日志中连续失败次数是否正确累加并在恢复后是否重置为 0。至此一个具备完整感知-决策-执行循环的最小化 Java Agent 已经实现并运行。它虽然简单但包含了 Agent 的所有核心要素。4. 进阶处理复杂场景与常见陷阱一个可用的原型与一个健壮的生产级 Agent 之间存在巨大差距。以下是你在进阶开发中必然会遇到的问题和解决方案。4.1 内存管理与OutOfMemoryErrorAgent 通常是长时间运行的服务内存泄漏是致命问题。错误java.lang.OutOfMemoryError: Java heap space或insufficient memory经常发生。常见内存泄漏点无限增长的集合Agent 的记忆体如Memory实现如果无限制地缓存历史数据最终会耗尽内存。资源未关闭感知器或执行器中使用的连接数据库、HTTP 客户端、文件流未正确关闭。线程泄漏错误地创建了未管理的线程或线程池。大对象驻留缓存了大型对象如完整的网页内容且未及时释放。解决方案与最佳实践为记忆体设置边界使用有容量限制的数据结构如LinkedHashMap实现 LRU 缓存或使用 Guava 的CacheBuilder。import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import java.util.concurrent.TimeUnit; public class BoundedMemory implements Memory { private CacheString, Object dataCache CacheBuilder.newBuilder() .maximumSize(1000) // 最多缓存1000条 .expireAfterWrite(10, TimeUnit.MINUTES) // 写入10分钟后过期 .build(); // ... 使用 cache.put(key, value) 和 cache.getIfPresent(key) }使用 try-with-resources确保所有Closeable资源被自动关闭。try (BufferedReader br new BufferedReader(new FileReader(path))) { return br.readLine(); }监控 JVM 内存在启动参数中添加-XX:PrintGCDetails -Xloggc:gc.log来记录 GC 日志。生产环境使用 JMX 或 Prometheus Micrometer 进行监控。定期进行负载测试模拟长时间运行使用 VisualVM 或 JProfiler 工具分析堆内存变化定位泄漏点。4.2 错误处理与 Agent 自恢复Agent 执行周期中任何一步失败都不应导致整个 Agent 进程崩溃。我们需要健壮的错误处理。错误处理策略组件级容错在每个组件感知器、决策引擎、执行器内部进行细致的异常捕获和处理避免异常向上抛出中断循环。周期隔离一个周期的失败不应影响下一个周期。AgentSchedulerService中的try-catch已经做到了这一点。状态恢复对于关键状态记忆应考虑持久化到数据库或文件。当 Agent 崩溃重启后能从最近的一致状态恢复而不是从头开始。熔断与降级如果感知的目标服务长时间不可用应触发熔断暂时跳过感知步骤避免无意义的请求和资源浪费。可以使用 Resilience4j 库。// 在感知器中加入简单的熔断逻辑 public class ResilientWebsitePerceptor implements PerceptorBoolean { private int failureCount 0; private static final int FAILURE_THRESHOLD 5; private volatile boolean circuitOpen false; private long circuitOpenedTime 0; private static final long CIRCUIT_RESET_TIMEOUT 60000; // 1分钟 Override public Boolean perceive() { if (circuitOpen) { if (System.currentTimeMillis() - circuitOpenedTime CIRCUIT_RESET_TIMEOUT) { circuitOpen false; // 超时后尝试半开 failureCount 0; } else { log.warn(熔断器开启跳过本次感知。); return null; // 或返回一个降级值 } } try { Boolean result doPerceive(); // 实际感知逻辑 failureCount 0; // 成功则重置 return result; } catch (Exception e) { failureCount; log.error(感知失败失败次数: {}, failureCount, e); if (failureCount FAILURE_THRESHOLD) { circuitOpen true; circuitOpenedTime System.currentTimeMillis(); log.error(达到失败阈值开启熔断。); } return null; // 感知失败返回null或特定错误状态 } } // ... doPerceive() 方法 }4.3 配置外部化与多 Agent 管理硬编码的配置如检查的 URL、调度间隔是不可接受的。应使用 Spring Boot 的ConfigurationProperties或Value注解从application.yml读取配置。# application.yml agent: health-check: target-url: https://www.example.com schedule-interval-ms: 300000 # 5分钟 failure-threshold: 3 # 连续失败几次才报警// config/AgentProperties.java package com.example.agent.config; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; Component ConfigurationProperties(prefix agent.health-check) Data public class AgentProperties { private String targetUrl; private long scheduleIntervalMs 300000; private int failureThreshold 3; }然后在感知器、决策引擎和调度服务中注入AgentProperties并使用这些配置。当需要管理多个不同类型的 Agent 时可以考虑实现一个AgentRegistry或使用ApplicationContext来查找所有实现了Agent接口的 Bean并由一个统一的AgentManager服务来管理它们的生命周期启动、停止、暂停、状态汇报。4.4 框架选型何时引入 Agent 框架当你的 Agent 逻辑变得非常复杂涉及工作流编排、LLM 集成、复杂记忆管理时可以考虑使用成熟的 Agent 框架而不是从头造轮子。LangChain4JJava 版的 LangChain非常适合集成大语言模型LLM来构建 AI Agent。它提供了链Chains、工具Tools、记忆Memory等高级抽象。Spring AISpring 官方推出的 AI 项目旨在简化 Java 中 AI 应用的开发包含对多种模型和向量数据库的支持也涵盖了 Agent 的概念。Apache Camel虽然主要是一个集成框架但其基于路由和 EIP企业集成模式的设计非常适合构建反应式、事件驱动的数据感知和处理的 Agent。选择建议如果你的 Agent 核心是业务规则和系统集成用 Spring Boot 自定义调度足以应对。如果你的 Agent 需要复杂的自然语言理解、对话或基于 LLM 的推理则应评估 LangChain4J 或 Spring AI。5. 生产环境部署与运维考量将 Agent 部署到生产环境需要关注稳定性、可观测性和资源管理。进程管理使用systemdLinux、Supervisor或容器化Docker K8s来管理 Agent 进程确保崩溃后能自动重启。日志与监控日志使用 SLF4J Logback合理设置日志级别INFO、ERROR并将日志收集到 ELK 或 Loki 等集中式日志系统。在日志中清晰标识 Agent 名称和周期 ID。指标使用 Micrometer 暴露 JVM 指标内存、线程、GC和自定义业务指标如感知次数、决策分布、执行成功率并集成到 Prometheus Grafana。配置管理所有配置如目标地址、阈值、开关必须外部化支持动态刷新如使用 Spring Cloud Config 或 Apollo避免重启。版本与回滚对 Agent 代码进行版本控制并建立清晰的发布和回滚流程。确保新版本 Agent 上线时旧版本的状态记忆能够兼容或安全迁移。资源限制在容器或虚拟机中为 Agent 进程设置合理的 CPU 和内存限制防止单个 Agent 异常时拖垮整个主机。从 Java 开发转向 Agent 开发最大的思维转变是从“被动响应请求”到“主动追求目标”。开始时可以从一个像网站健康检查这样具体、简单的目标入手实现感知-决策-执行的最小闭环。在迭代过程中逐步引入记忆、学习、容错、配置化等复杂特性。时刻牢记生产环境的要求监控、日志、配置外置和错误处理。当你熟练掌握了这些模式后就可以将这些组件应用于更复杂的场景如订单自动审核、智能运维、数据管道监控等真正为你的系统赋予自主智能的能力。下一步可以尝试将决策引擎替换为基于 Drools 的规则引擎或者集成 LangChain4J 来让 Agent 能够理解自然语言指令这将打开一片全新的可能性。

相关新闻

2026/9/1 4:36:00

群晖硬盘插Ubuntu不识别?mdadm+LVM+RAID手动恢复数据全攻略

简介:面向Synology NAS非RAID配置设备的数据恢复场景,这份代码资源提供一套基于Ubuntu 18系统的硬盘救援操作方案,适合具备Linux基础、需要自行处理群晖故障硬盘的运维与NAS用户。资源包内共3个文件,包含可直观查看步骤的HTML说明…

2026/9/1 4:30:59

1公里全球DEM拼接影像:获取、预处理与坡度坡向提取实战

简介:覆盖全球范围的一公里分辨率数字高程模型拼接影像文件,采用地理标记影像格式存储,面向地理信息系统分析、地形制图和三维场景构建等用户。数据含有完整的地理参考信息,可直接加载到主流地理信息软件中使用,无需额…

2026/9/1 4:30:59

HarmonyOS 6.1+ 新特性实战(15):Core File原子写入与崩溃恢复方案

直接覆盖JSON文件有一个隐蔽窗口:旧内容已经截断,新内容还没完全落盘。进程在这个窗口退出,下次启动只能读到半段文本。原子保存应把“生成新版本”和“让新版本生效”拆成两个步骤。 方案面向HarmonyOS 6.1.1 Release SDK(API 2…

2026/9/1 4:51:01

从零学 Web 漏洞挖掘:40 种常见漏洞原理 + 检测姿势全覆盖

​ 各位靓仔,搞网络安全,就像在雷区蹦迪,一不小心就 Boom Shakalaka!Web漏洞这玩意儿,说白了就是信任危机 验证掉链子。开发者们啊,总是对用户输入、权限边界和系统交互爱的太深,结果翻车了&a…

2026/9/1 4:51:01

Excel XLOOKUP函数实现多条件查询:原理、公式与实战案例

这次我们来看一个Excel数据处理中的高频痛点:多条件查询。无论是销售数据分析、库存管理还是人事信息匹配,经常需要根据两个或更多条件,从海量数据中精准定位并提取目标值。传统方法如VLOOKUP嵌套IF、INDEXMATCH组合,公式复杂且易…

2026/9/1 4:51:01

常见限流算法与Sentinel限流机制

1.常见限流算法1. 固定时间窗口算法(Fixed Window Counter)这是最简单粗暴的算法。原理:将时间划分为固定的窗口(比如从0点到1点)。在每个窗口内维护一个计数器,每来一个请求就加1。如果计数器超过了阈值&a…

2026/9/1 4:51:01

漏洞挖掘实战指南:从入门到高阶,避开误区高效落地

​ 漏洞挖掘实战指南:从入门到高阶,避开误区高效落地 在网络安全攻防对抗日趋激烈的今天,漏洞挖掘已成为安全从业者的核心必备技能,更是企业主动防御体系的关键支撑。不同于单纯的工具操作,漏洞挖掘是“技术功底攻击思…

2026/9/1 4:51:01

Linux 多线程——线程互斥:从抢票问题到 Mutex 底层原理

一、线程为什么需要互斥同一进程中的多个线程共享进程的地址空间,因此多个线程可能同时访问同一份数据。例如:int ticket 100;如果创建多个线程共同执行售票逻辑:if (ticket > 0) {printf("sell ticket:%d\n", ticket);ticket-…

2026/8/31 1:05:20

vSound小提琴数字处理器实操指南:从接线到演出的完整配置

电小提琴或者原声小提琴插电演出,第一个绕不开的坎就是声音难听。原声琴的共鸣和空气感一旦进了拾音器,出来的往往是一坨干瘪、发尖、带着奇怪塑料味的信号。我当初第一次把琴接上乐队调音台,直接被主唱吐槽"你这声音像在锯钢丝"。…

2026/8/31 2:14:20

传感器接口IC如何攻克生物化学传感的微弱信号难题?

1. 从电极到比特流:为什么生物化学传感必须依赖专用接口IC 做生物化学传感的人都有过类似的经历:明明传感器本身性能很好,信号输出却一塌糊涂——噪声大、漂移明显、重复性差,怎么调都达不到预期。很多时候问题并不在传感器&#…

2026/8/31 1:41:28

STM32F411CEU6多通道ADC采集:扫描模式+DMA实现详解

1. 多通道 ADC 的用武之地把“Multichannel ADC”和“STM32F411CEU6”这两个关键字放在一起,其实就是嵌入式开发里最常遇到的一类需求:用一块不算贵的 MCU,同时采集多路模拟信号。STM32F411CEU6 是 48 引脚的 Cortex-M4F 主控,主频…

2026/9/1 0:00:42

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/1 0:00:42

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/1 0:00:42

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

2026/9/1 0:00:42

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行&#xff0c;Type-C接口算是典型的“看着简单&#xff0c;做起来全坑”的东西。光引脚就24个&#xff0c;高低速信号、电源、控制线全部塞在一个小小的连接器里&#xff0c;如果PCB布局不做规划&#xff0c;打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/1 0:00:42

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/1 0:00:42

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…