Buffalo任务中不能直接传递复杂对象,因其调度的是任务而非Web Worker;前端调用时需JSON序列化参数,大文件应传URL,二进制数据可转Base64;Worker通信属前端自主控制,需用Transferable Objects避免深拷贝。

Buffalo 任务中不能直接传递复杂对象
Buffalo 调度框架本身不处理 Worker 线程间的数据序列化与传输逻辑——它调度的是任务(Task),不是 Web Worker。你看到的 postMessage、Transferable Objects 等机制,属于浏览器 Web Worker API,和 Buffalo 无关。很多开发者混淆了「Buffalo 的任务执行节点」和「前端页面里起的 Worker 线程」,结果在 Buffalo 的 task.execute() 里硬塞 postMessage,自然报错或数据为空。
真正需要传递数据的场景:前端界面调用 Buffalo 任务时附带参数
如果你是在 Web UI 层(比如 Face Analysis WebUI)中,点击“启动人脸比对任务”,想把一张 Base64 图片、一组阈值配置、目标库 ID 这类结构化数据传给 Buffalo 后端任务,那关键不是“Worker 怎么传”,而是「如何让 Buffalo 正确接收并解析复杂参数」:
Buffalo框架 1.0.1 版本源码包下载,适合需要错误处理改进、依赖更新、render.Download 注释和 request logger 调整的 v1 项目。
- Buffalo 任务入参统一走 JSON 序列化,
Map、List、嵌套对象都支持,但要求可 JSON 化(不能含函数、Date实例、undefined、循环引用) - 前端调用时,用
JSON.stringify()显式序列化,后端用ObjectMapper.readValue()(Jackson)或对应语言的反序列化器解析 - 大文件(如原始图像二进制)不要塞进 JSON body,应先上传到对象存储(如京东云 OSS),传 URL + meta 描述即可
- 若必须传二进制数据,前端转成 Base64 字符串(注意长度限制,HTTP header 或 body 都有默认上限),后端再
Base64.getDecoder().decode()
如果真在前端用了 Web Worker 处理 Buffalo 任务结果
比如你用 Worker 解析 Buffalo 返回的百万级依赖图 JSON,做可视化预处理——这时才涉及 Worker 数据传递。但 Buffalo 不参与这个过程,纯属前端自主控制:
- 别用
JSON.parse()+postMessage()传大 JSON:会触发完整拷贝,卡顿明显 - 改用
Transferable Objects:把解析后的ArrayBuffer或SharedArrayBuffer转移过去,例如把依赖关系拓扑结构序列化为紧凑二进制格式(如 FlatBuffers),再转移 - 注意
postMessage(data, [transferList])第二个参数必须显式列出要转移的对象,漏写就变成深拷贝 - 转移后原线程的
ArrayBuffer.byteLength变为 0,别试图再次读取
容易被忽略的边界点
Buffalo 任务参数最大长度受网关(如 Nginx)和 Spring Boot 的 spring.mvc.max-http-header-size / server.max-http-request-size 限制,默认常为 1MB。传一个 5MB 的 Base64 图片字符串,请求会在网关层直接 413。这不是 Buffalo 的 bug,是基础设施配置问题——得同步调大网关和后端的请求体上限,且要考虑日志系统是否会对超长参数截断或报错。

















