跳到正文
LICENTIVO / INTEGRATION

用每月功能次数限制软件导出

设置每个 UTC 月 500 次导出,让 SDK 自动预留、执行和结算。保留稳定业务编号,避免重试重复扣次或重复执行已完成任务。

功能流程 · 九种 SDK 通用更新日期

1. 设置功能次数规则

在授权策略中启用 export 功能,设置每月上限为 500 次,并决定额度用完后拒绝还是按该功能的超额规则允许。

功能次数属于客户许可证,和厂商工作空间套餐的设备额度、API 调用额度分别计算。按日和按月的功能周期使用 UTC,每月在下一个 UTC 自然月开始时重置。

2. 启动一个 SDK 客户端

按 SDK 文档安装所用语言,通过 product.json 与客户授权码启动。九种 SDK 都有同一计次业务流程;下面展示 Go 调用,放在应用现有的返回 error 的函数中。

普通权益使用 RunFeature,次数限制操作使用 RunMeteredFeature。本地权益检查通过,不代表在线次数仍足够。

3. 将业务放进计次回调

调用前持久保存唯一任务编号,重试同一任务继续使用该编号。SDK 先预留一次,再执行回调,业务成功后确认,已确定失败时取消预留。

Go · 放在返回 error 的函数中
// client was opened once at application startup.
// jobID comes from your durable business task record.
jobID := os.Getenv("LICENTIVO_OPERATION_ID")
if jobID == "" {
    return fmt.Errorf("persist a unique task ID before exporting")
}
err := client.RunMeteredFeature(ctx, "export", 1, jobID, func() error {
    // Return success only after the output has been saved.
    return os.WriteFile("licensed-report.txt", []byte("Metered export\n"), 0600)
})
if err != nil {
    return err
}

4. 恢复中断任务

任务已被记录为业务成功时,重试同一编号可以继续结算,不会重新执行回调。但如果进程在业务执行途中退出,SDK 无法判断外部操作是否已经完成。

先检查业务保存的结果;确认成功调用 ResolveMeteredFeature(ctx, jobID, true),确认失败则传 false。该接口只处理计次结算,不执行业务。不要盲目重复付款、交付文件或其他不可逆操作。

默认预留 15 分钟,并受 UTC 周期重置边界限制,需要在过期前完成与结算。可能超过预留时长的长任务不能直接使用简单回调封装。已取消任务如由客户重新发起,应使用新的任务编号。

5. 验证计次行为

  1. 先用较小测试额度,成功导出后已用次数应加一。
  2. 让回调在完成前返回错误,预留次数应取消。
  3. 重试已记录成功的编号,确认业务回调没有重复执行。
  4. 用完拒绝超额的额度,确认回调未执行,并展示下次重置时间。
  5. 在测试环境模拟任务中断,按已保存的业务记录恢复结算。

容易用错的地方

预留和确认需要联网,离线缓存许可证并不允许离线计次。计次操作被拒绝后不能改成普通权益操作继续执行。

直接 Consume 会立即扣次。如果需要业务成功后才计次,使用计次回调。业务完成后网络失败属于结算恢复问题,不能直接判断业务失败。

稳定任务编号和 SDK 日志帮助重试,但不能代替业务事务和结果持久化。恢复时需要同时保留业务结果以及 SDK 私有缓存。