切换主题
批次预检与发布
本页阅读位置
完成第一轮对话后,按当前业务需求深入。Spring 常规声明优先使用 RegistrationManifest 与注解;本页的底层 register / publish 或直连方法供协议细化与兼容集成参考。
SDK 示例
java
var bundle = new ReleaseBundle(List.of(
new ReleaseBundle.Resource("tools", "query-device", "1.0.0", 1),
new ReleaseBundle.Resource("agents", "monitor-agent", "1.1.0", 2)
), new ReleaseBundle.Entry("monitor-agent", "1.1.0"), "上线设备查询能力");
var plan = client.previewRelease(bundle).join();
if (!Boolean.TRUE.equals(plan.get("valid"))) {
throw new IllegalStateException("预检失败:" + plan.get("errors"));
}
String requestKey = UUID.randomUUID().toString(); // 同次提交重试保留此值
var record = client.publishRelease(bundle, (String)plan.get("planHash"),
((Number)plan.get("applicationRevision")).longValue(), requestKey).join();
var page = client.releases(50, 0).join();
var detail = client.release((String)record.get("id")).join();kotlin
import dev.sparktide.sdk.kotlin.*
val bundle = releaseBundle {
resource("tools", "query-device", "1.0.0", toolRevision)
resource("agents", "monitor-agent", "1.1.0", agentRevision)
defaultAgent("monitor-agent", "1.1.0")
reason("上线设备查询能力")
}
val plan = client.previewRelease(bundle).awaitResult()
check(plan["valid"] == true) { "预检失败:${plan["errors"]}" }
val requestKey = java.util.UUID.randomUUID().toString()
val record = client.publishRelease(bundle, plan["planHash"] as String,
(plan["applicationRevision"] as Number).toLong(), requestKey).awaitResult()Java 示例说明:
client 是持有应用管理凭据的 PlatformClient;普通用户无发布权限。修订值从当前 Registry 读取,不能写死用于真实交付。示例版本要求所有未列出的依赖已经发布。
错误与重试
预检无副作用;提交前任何草稿、依赖或应用变更都可能令计划失效。412 修订不匹配或 409 计划变化须重新读取并预检,再使用新键;网络异常先查询记录,同一次不确定结果重试保持原批次、计划头和键。SDK 不自动重放发布请求。
一次发布最多 64 项,不允许重复引用;对象构造后集合不可变。已发布版本保持不可编辑;回退使用默认入口管理方法,既有 Run 和业务副作用不自动回滚。记录只读查询按应用隔离,分页 nextOffset=null 表示结束。
文档来源与验证记录
| 字段 | 内容 |
|---|---|
| 状态 | 已确认 |
| 日期 | 2026-09-30 |
| 来源 | ReleaseBundle、PlatformClient、ReleaseDsl、发布协议 |
| 责任人 | SparkTide 维护者 |
| 关联任务 | B08、G05 |
| 结论 | SDK 明确声明资源修订并预检整批,不暗中逐个发布依赖 |
| 证据 | Java HTTP 请求头和正文测试、Kotlin DSL 测试、平台发布集成测试 |
