5.modelHandler处理model

一、前言

前面的文章主要介绍了logback将logback.xml中的节点路径解析成一个个的model, 最后在DefaultProcessor中使用modelHandler对model进行处理, 本节将介绍几个常用标签节点的modelHandler解析的详细过程

二、常用modelHandler解析model

configuration标签解析

configuration节点对应的是ConfigurationModel, 使用ConfigurationModelHandlerFull解析, ConfigurationModelHandlerFull继承了ConfigurationModelHandler类, 我们先看一下ConfigurationModelHandler

public class ConfigurationModelHandler extends ModelHandlerBase {
   
   
    ConfigurationModel configurationModel = (ConfigurationModel) model;

        // See LOGBACK-527 (the system property is looked up first). Thus, it overrides
        // the equivalent property in the config file. This reversal of scope priority
        // is justified by the use case: the admin trying to chase rogue config file
        // 1.debug属性系统; 属性中获取 logback.debug
        String debugAttrib = OptionHelper.getSystemProperty(DEBUG_SYSTEM_PROPERTY_KEY, null);
        if (debugAttrib == null) {
   
   
            // configuration的debug属性
            debugAttrib = mic.subst(configurationModel.getDebugStr());
        }
        
        // 1.logback.debug不是空 2并且不是非false 3并且不是null字符串
        if (!(OptionHelper.isNullOrEmptyOrAllSpaces(debugAttrib) || debugAttrib.equalsIgnoreCase(FALSE.toString())
                || debugAttrib.equalsIgnoreCase(NULL_STR))) {
   
   
            // 添加OnConsoleStatusListener监听器, 并打印状态
            StatusListenerConfigHelper.addOnConsoleListenerInstance(context, new OnConsoleStatusListener());
        }
        // 查询scan属性, 非false的话打印日志
        processScanAttrib(mic, configurationModel);

        LoggerContext lc = (LoggerContext) context;
        // packagingData属性, 用于打印打包信息, 默认是false
        boolean packagingData = OptionHelper.toBoolean(mic.subst(configurationModel.getPackagingDataStr()),
                LoggerContext.DEFAULT_PACKAGING_DATA);
        lc.setPackagingDataEnabled(packagingData);

        ContextUtil contextUtil = new ContextUtil(context);
        contextUtil.addGroovyPackages(lc.getFrameworkPackages());
}

方法小结

  1. 这个方法解析了configuration标签的debug属性和scan属性和packagingData属性
  2. debug属性为true的话, 将会添加一个OnConsoleStatusListener监听器, 打印logback日志框架启动时的一些日志
  • 可以使用-Dlogback.debug设置系统级参数来控制, 它的优先级比configuration标签的debug属性还要高
  1. scan属性, 如果开启的话, 将会监听日志配置文件, 可以用来动态修改日志等级
  2. packagingData属性, 如果为true, 将会打印打包相关的日志

ConfigurationModelHandlerFull

public class ConfigurationModelHandlerFull extends ConfigurationModelHandler {
   
   
    
    protected void postProcessScanAttrib(ModelInterpretationContext mic, ConfigurationModel configurationModel) {
   
   
        // scan属性
        String scanStr = mic.subst(configurationModel.getScanStr());
        // scanPeriod属性
        String scanPeriodStr = mic.subst(configurationModel.getScanPeriodStr());
        detachedPostProcess(scanStr, scanPeriodStr);
    }
    
    public void detachedPostProcess(String scanStr, String scanPeriodStr) {
   
   
        // scan 非false, 一般可以设置scan为true
        if (!OptionHelper.isNullOrEmptyOrAllSpaces(scanStr) && !"false".equalsIgnoreCase(scanStr)) {
   
   
            // 默认是ScheduledThreadPoolExecutor类, 核心线程是4个
            ScheduledExecutorService scheduledExecutorService = context.getScheduledExecutorService();
            // 1.校验热加载文件;动态监听的配置文件, 默认是监听logback.xml文件, 所以默认是true
            // 可以使用configuration/propertiesConfigurator节点来指定热加载的文件
            boolean watchPredicateFulfilled = ConfigurationWatchListUtil.watchPredicateFulfilled(context);
            if (!watchPredicateFulfilled) {
   
   
                addWarn(FAILED_WATCH_PREDICATE_MESSAGE_1);
                addWarn(FAILED_WATCH_PREDICATE_MESSAGE_2);
                return;
            }
            // 2.创建周期任务, 可以用来动态修改日志等级
            ReconfigureOnChangeTask rocTask = new ReconfigureOnChangeTask();
            rocTask.setContext(context);

            addInfo("Registering a new ReconfigureOnChangeTask " + rocTask);
            // 3.发布热加载对象注册事件
    context.fireConfigurationEvent(ConfigurationEvent.newConfigurationChangeDetectorRegisteredEvent(rocTask));

            // 扫描间隔 scanPeriod 默认是1min; 格式 '数字 单位'
            Duration duration = getDurationOfScanPeriodAttribute(scanPeriodStr, SCAN_PERIOD_DEFAULT);

            addInfo("Will scan for changes in [" + ConfigurationWatchListUtil.getConfigurationWatchList(context) + "] ");
            addInfo("Setting ReconfigureOnChangeTask scanning period to " + duration);

            // 4.执行周期任务
            ScheduledFuture<?> scheduledFuture = scheduledExecutorService.scheduleAtFixedRate(rocTask, duration.getMilliseconds(), duration.getMilliseconds(),
                            TimeUnit.MILLISECONDS);
            rocTask.setScheduredFuture(scheduledFuture);
            context.addScheduledFuture(scheduledFuture);
        }

    }
}

方法小结

  1. configuration标签的scan=true用来开启热加载扫描文件
  2. 默认热加载的文件是logback.xml, 可以通过configuration/propertiesConfigurator标签添加热加载的文件, 只支持添加properties后缀和网络地址的文件
  3. 使用4个核心的周期执行器执行扫描任务, 任务对象是ReconfigureOnChangeTask
  4. 默认是一分钟扫描一次, 可以通过configuration标签的scanPeriod属性置顶执行周期, 例如 scanPeriod="5 minute", 单位可选为milli(或millisecond)、second(或seconde)、minute、hour、day

ReconfigureOnChangeTask热加载配置文件

public class ReconfigureOnChangeTask extends ContextAwareBase implements Runnable {
   
   
    public void run() {
   
   
        // 1.发布热加载运行事件
        context.fireConfigurationEvent(newConfigurationChangeDetectorRunningEvent(this));
        // 2.获取热加载需要扫描的文件们
        ConfigurationWatchList configurationWatchList = ConfigurationWatchListUtil.getConfigurationWatchList(context);
        if (configurationWatchList == null) {
   
   
            addWarn("Empty ConfigurationWatchList in context");
            return;
        }
        if (configurationWatchList.emptyWatchLists()) {
   
   
            addInfo("Both watch lists are empty. Disabling ");
            return;
        }
        // 3.获取热加载的本地文件
        File changedFile = configurationWatchList.changeDetectedInFile();
- Role: 资深Java Spring AI架构师与全栈开发专家 - Background: 用户希望构建一个基于Java Spring AI的智能体与工作流模型系统,前端采用Vue2实现工作流配置,后端则需完整实现功能,包括模型配置、知识库管理、HTTP通信、选择器、文本处理、代码执行、变量管理、消息传递、工作流控制、追问机制、意图识别、参数提取等功能,以实现一个高度可配置且功能强大的智能工作流系统。 - Profile: 你是一位在Java Spring AI领域有着深厚造诣的架构师,同时精通前端Vue2开发,能够将前端与后端无缝整合,具备丰富的全栈开发经验,擅长设计和实现复杂的智能系统架构,对工作流模型和AI智能体的实现有深入的理解和实践经验。 - Skills: 你精通Java Spring框架、AI技术(如机器学习、自然语言处理等)、Vue2前端开发、工作流设计、数据库设计、API开发、系统集成、代码优化、性能调优以及敏捷开发方法。 - Goals: 1. 设计并实现一个基于Java Spring AI的智能体与工作流模型的后端架构,支持模型、知识库、HTTP、选择器、文本处理、代码、变量、消息、工作流、追问、意图识别、参数提取等功能。 2. 使用Vue2开发一个用户友好的前端界面,用于配置工作流,确保前端与后端的无缝交互。 3. 确保系统的可扩展性、可维护性和高性能,满足不同用户的需求。 - Constrains: 系统应遵循最佳的软件开发实践,包括代码的可读性、可维护性、安全性以及性能优化。前端界面应简洁直观,易于操作,后端服务应稳定可靠,支持高并发处理。 - OutputFormat: 提供详细的系统架构设计文档、前端代码(Vue2)、后端代码(Java Spring AI)、数据库设计文档、API接口文档以及部署指南。 - Workflow: 1. 分析需求,设计系统架构,包括前端界面布局和后端服务模块划分。 2. 开发前端界面,使用Vue2实现工作流配置功能,确保界面友好且功能齐全。 3. 开发后端服务,基于Java Spring AI实现智能体与工作流模型的核心功能,包括模型管理、知识库、HTTP通信等。 4. 进行前后端集成测试,确保系统各部分协同工作,功能正常。 5. 优化系统性能,确保系统的稳定性和高效性。 6. 编写系统文档,包括架构设计、代码说明、API文档、部署指南等。 - Examples: - 例子1:工作流配置 前端界面提供一个可视化的工作流配置工具,用户可以通过拖拽组件(如模型、知识库、HTTP请求等)来构建工作流。后端提供API接口,用于保存和加载工作流配置。 - 例子2:意图识别与参数提取 用户输入一段文本,后端通过自然语言处理技术识别意图并提取关键参数。例如,用户输入“我想查询订单号为12345的状态”,系统识别意图是“查询订单状态”,并提取参数“订单号:12345”。 - 例子3:HTTP通信 在工作流中配置一个HTTP请求节点,后端通过Java Spring的HttpClient发起HTTP请求,获取外部数据,并将结果传递到下一个工作流节点。 - 例子4:代码执行 用户可以在工作流中配置代码执行节点,后端提供一个安全的代码执行环境,允许用户运行自定义代码片段,如数据处理逻辑或简单的计算。 - Initialization: 在第一次对话中,请直接输出以下:您好!作为资深Java Spring AI架构师与全栈开发专家,我将协助您构建一个基于Java Spring AI的智能体与工作流模型系统。请告诉我您对系统功能的具体需求,以及您希望优先实现的功能模块,我们可以开始详细规划和开发。
03-21
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

uncleqiao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值