ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

xberg 的 Dart 插件管理实战:使用 clearPostProcessors 清空后处理器注册表

xberg 的 Dart 插件管理实战:使用 clearPostProcessors 清空后处理器注册表 后端AI 应用NLP【免费下载链接】xbergPolyglot document intelligence with a Rust core: extract text, metadata, images, tables, and structured data from 106 formats across 140 file extensions, plus code intelligence for 371 languages. Fifteen bindings, with CLI, REST API, and MCP server.项目地址https://gitcode.com/gh_mirrors/kr/xberg点击查看免费下载导读本文围绕 xberg 仓库中自动生成的 Dart API 示例文档 post_processors_clear.md系统讲解如何在 Dart 绑定中通过XbergBridge.clearPostProcessors()清空全部后处理器post-processor插件并深入到 Rust 核心的注册表实现、内置处理器自动恢复机制以及与unregisterPostProcessor的语义差异。读完本文你将掌握后处理器插件从注册、列出、注销到整体清空的完整生命周期管理并理解该 API 在 15 种绑定语言中的一致性设计与测试约束。后处理器插件机制先理解“清空”的对象在 xberg 的插件体系中后处理器post-processor是文档提取流水线中的一环负责在ExtractedDocument生成之后对其进行二次加工例如分类、摘要、翻译、字幕生成、OCR 后处理、命名实体识别、脱敏、质量控制与关键词抽取等。从 Rust 核心源码看crates/xberg/src/plugins/processor/mod.rs 定义了整套机制PostProcessortrait 与ProcessingStage枚举声明了处理器需实现的process(mut ExtractedDocument, ExtractionConfig)方法以及所属的处理阶段每个处理器还有一个priority属性默认 50在同一处理阶段内优先级越高越先执行全局注册表POST_PROCESSOR_REGISTRYArcRwLockPostProcessorRegistry存放所有已注册的处理器实例定义在 crates/xberg/src/plugins/registry/mod.rs。因此“清空所有后处理器”本质上是把全局注册表中的全部处理器含内置与自定义一次性移除让下一次提取流水线在快照处理器缓存时得到一个空的注册表。示例文档的定位由 alef 生成的跨语言契约夹具post_processors_clear.md 并不是手写文档而是仓库通过 alef 工具从契约夹具自动生成的 Dart 代码片段。文件头部的元信息说明了这一点生成命令为alef e2e generate校验新鲜度用alef verify文件本身标注 “DO NOT EDIT”它的数据源是 fixtures/plugin_api/post_processors_clear.json该 JSON 声明了夹具的id、categorypost_processor_management、callRust 侧函数名clear_post_processors以及断言not_error调用后不抛错即为通过。该夹具的覆盖范围很有信息量除 C 语言外它同时为 Dart、Rust、Java、C#、Go、Python、TypeScript、Kotlin-Android、Swift、Ruby、PHP、Elixir、Zig、Wasm 等 15 种语言生成等价片段。C 被明确排除原因是插件注册表接收宿主语言回调trait bridgeC API 本身不暴露注册调用因此也没有配套的 clear/unregister 调用这一设计决策记录在 fixtures/plugin_api/post_processors_clear.json 与概念文档 plugin-system.md 中。Dart 绑定调用链从桥接类到 Rust 核心示例文档中的核心调用是XbergBridge.clearPostProcessors()。这条调用链在 Dart 侧有两层实现公开 API 位于 packages/dart/lib/src/xberg.dart#L373-L376clearPostProcessors()直接转调rust_bridge.clearPostProcessors()FRBflutter_rust_bridge生成的桥接层位于 packages/dart/lib/src/xberg_bridge_generated/lib.dart#L1513-L1516最终调用RustLib.instance.api.crateClearPostProcessors()其文档注释明确说明该调用会移除xberg::plugins::registry::get_post_processor_registry()中的全部插件。跨过 FFI 边界后Rust 侧的 clear_post_processors 函数执行两件事pub fn clear_post_processors() - crate::Result() { use crate::plugins::registry::get_post_processor_registry; crate::core::pipeline::with_builtin_registration_recovery(|| get_post_processor_registry().write().shutdown_all()) }其中shutdown_all()遍历注册表并调用每个插件的shutdown()随后清空集合with_builtin_registration_recovery则负责下文所述的“内置恢复”语义。clear 与 unregister 的核心差异内置处理器自动恢复post_processors_clear.md 的标题强调“Clear all post-processors and verify list is empty”但要真正用好这个 API必须理解它和unregisterPostProcessor(name)的关键区别。这两者的语义差异在源码注释中写得很清楚crates/xberg/src/plugins/processor/mod.rs#L59-L81unregister_post_processor(name)只移除指定名字的处理器且该名字会被加入“抑制名单”suppression set。内置处理器若被注销会保持缺席状态直到被显式重新注册或整体清空才恢复clear_post_processors()移除全部处理器但会先清除抑制名单并把BUILTIN_REGISTRATION_REQUIRED置为truecrates/xberg/src/core/pipeline/initialization/mod.rs#L196-L208。实际效果是清空之后下一次执行需要后处理的提取时流水线会自动把已启用的内置处理器重新注册回来发生在快照处理器缓存之前而自定义处理器保持移除状态。也就是说clearPostProcessors()是“把注册表重置为出厂状态”而不是“永久禁用后处理功能”。此外清空与注册、注销共享同一把注册互斥锁和 epoch 计数因此如果恰好有提取任务正在执行某份处理器快照clear_post_processors会返回可重试的 in-use 错误调用方需要重试测试侧的PostProcessorRegistryGuard也基于这一机制在用例间保证隔离crates/xberg/src/plugins/registry/mod.rs#L180-L269。完整可运行的 Dart 示例下面是在真实 Dart 项目中复现该夹具的完整代码。相比原文档这里补充了初始化与资源释放的注释便于直接照搬到自己的应用里import package:xberg/xberg.dart; import package:xberg/src/xberg_bridge_generated/frb_generated.dart show RustLib; Futurevoid main() async { // 1. 初始化 Rust 运行时FRB 生成的桥接层 await RustLib.init(); try { // 2. 清空全部后处理器内置处理器会在下次提取时自动恢复 // 自定义处理器保持移除状态 await XbergBridge.clearPostProcessors(); // 3. 可选验证确认注册表为空 // final names await XbergBridge.listPostProcessors(); // assert(names.isEmpty); } finally { // 4. 释放 Rust 运行时资源 RustLib.dispose(); } }几个实操要点RustLib.init()必须在任何桥接调用之前完成RustLib.dispose()放在finally中确保异常时也能释放资源这是示例文档采用的惯例夹具断言类型为not_error即只要调用不抛出异常即通过若需进一步校验“列表为空”可配合list_post_processorsDart 侧对应listPostProcessors查看注册表快照其 Rust 实现见 crates/xberg/src/plugins/processor/registry.rs该夹具侧效果标记为safe不会改动任何磁盘文件或外部服务可在测试中安全反复执行。与相关夹具组合使用完整的插件管理矩阵clearPostProcessors在夹具套件中并非孤例它属于post_processor_management类目下的一组契约测试。仓库 fixtures/plugin_api 目录中还有与之配套的register_post_processor_trait_bridge.json验证用 trait bridge 注册 Dart 实现的处理器unregister_post_processor_after_register.json验证注册后按名注销post_processors_list.json验证列出注册表。一个典型测试编排是registerPostProcessor注入自定义处理器 →listPostProcessors确认存在 →unregisterPostProcessor按名移除或clearPostProcessors整体清空→ 再次 list 验证结果。这与 Rust 侧测试对注册、抑制、恢复三个状态机的覆盖crates/xberg/src/core/pipeline/initialization/mod.rs#L210-L265一一对应保证了 Dart 绑定与核心语义的一致性。小结XbergBridge.clearPostProcessors()是 xberg Dart 绑定中插件生命周期管理的重要一环其行为可以概括为三条整体清空移除注册表中全部后处理器含内置与自定义并执行各插件的shutdown()自动恢复内置下一次后处理提取前已启用的内置处理器会自动重新注册因此它更像“重置”而非“永久禁用”与 unregister 互补需要保持单个处理器缺席而其余不动时用unregisterPostProcessor(name)需要恢复出厂状态时用clearPostProcessors()。该 API 经由 FRB 生成的桥接层直达 Rust 核心且通过 alef 夹具在 15 种绑定语言中保持了行为一致。对于基于 xberg 构建多语言文档智能管线的团队这份 Dart 示例文档及其背后的实现细节是理解整个后处理器插件系统的理想切入点。赞分享后端AI 应用NLP【免费下载链接】xbergPolyglot document intelligence with a Rust core: extract text, metadata, images, tables, and structured data from 106 formats across 140 file extensions, plus code intelligence for 371 languages. Fifteen bindings, with CLI, REST API, and MCP server.项目地址https://gitcode.com/gh_mirrors/kr/xberg点击查看免费下载相关推荐xberg OCR 后端插件管理使用 Dart 调用 clearOcrBackends 清空全局注册表xberg OCR 后端插件管理使用 Dart 调用 clearOcrBackends 清空全局注册表 本指南以 xberg 的 Dart 绑定为切入点系统后端AI 应用NLPXberg C 插件管理使用 ClearTokenizerBackends 清空 Tokenizer 后端注册表Xberg C 插件管理使用 ClearTokenizerBackends 清空 Tokenizer 后端注册表 导读 本文围绕 Xberg 仓库中 C 绑定后端AI 应用NLPxberg C 插件管理实战使用 ClearRerankerBackends 清空重排序后端注册表xberg C 插件管理实战使用 ClearRerankerBackends 清空重排序后端注册表 导读 本文聚焦 xberg 在 C 侧提供的重排序Rer后端AI 应用NLP上一篇Faust流处理背压机制如何实现高效的流量控制与资源管理下一篇OpenPencil Vue SDK 的 useTextEdit把 DOM 输入桥接到画布文本编辑模型创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表