1. 设置并发席位上限
企业有 100 台电脑、购买 10 个同时运行席位时,选择浮动授权模式,并将并发上限设为 10。限制的是活动会话,和绑定设备的注册数量不同。
一起配置心跳间隔与会话租约。租约需大于心跳间隔、最大随机抖动及 30 秒余量之和。较短租约回收异常席位更快,但允许的网络中断更短。
2. 启动时获取席位
从官网安装 SDK,通过 product.json 与客户授权码创建一个客户端。浮动启动必须获得在线授权,已保存的离线缓存不能代替会话获取。
下面 Go 片段放在返回 error 的应用函数中,需导入 context、os、os/signal 和 log。exportReport 是现有业务回调,customerKey 来自客户输入。
ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt)
defer stop()
client, err := licentivo.OpenWithLicense(ctx, "product.json", customerKey,
func(err error) { log.Printf("License refresh: %v", err) })
if err != nil {
return err // Show an activation error; do not start protected work.
}
defer client.Close() // Attempts to return a floating seat.
// Place this check inside each protected action, not only at startup.
if err := client.RunFeature("export", exportReport); err != nil {
return err
}
<-ctx.Done()3. 由 SDK 安排心跳
无需自己写定时器或并行发送 HTTP 心跳。SDK 按授权间隔续租会话,应用运行期间保留客户端。
每个受保护操作都使用 RunFeature。检查被拒绝时停止该操作并展示授权提示;后台连接错误也应可查看。不能认为启动成功就永久允许后续操作。
会话过期、许可证吊销或席位拒绝按签名授权规则处理。恢复连接需要服务器成功检查,不要修改本机到期信息延长会话。
4. 正常退出时释放
正常退出关闭客户端。Go 使用 defer client.Close();Java 和 C# 有作用域释放,C++ 和 Rust 使用析构,Python 使用上下文管理器,Ruby 和 JavaScript 提供 close。
进程崩溃或退出时无法联网,服务器会在会话租约过期后回收席位。这个等待是预期行为,提示其他用户可能需要等待席位回收。
5. 在两台不同设备验收
- 测试许可证设为一个浮动席位,在电脑 A 启动应用。
- 在电脑 B 启动,A 占用期间第二个受保护会话应拒绝。
- 正常退出 A,再确认 B 可以获得席位。
- 在隔离测试环境让 A 未清理退出,确认配置的租约过期后席位回收。
排查席位冲突
普通设备绑定与浮动退出规则不同:普通退出保留注册,浮动退出尝试归还席位。不要在普通应用每次关闭时解绑设备。
席位已占用可能是另一个运行实例,也可能是刚崩溃的进程等待租约过期。增加购买数量之前先查看控制台当前会话。
文件首次激活适用于设备绑定授权;即使浮动会话有效,计次操作也需要在线预留和结算。