跳到正文
LICENTIVO / INTEGRATION

用浮动授权限制软件同时运行人数

允许企业在多台电脑安装,同时限制在线使用席位。SDK 取得席位、维持会话租约,并在应用退出时尝试释放。

会话流程 · 九种 SDK 通用更新日期

1. 设置并发席位上限

企业有 100 台电脑、购买 10 个同时运行席位时,选择浮动授权模式,并将并发上限设为 10。限制的是活动会话,和绑定设备的注册数量不同。

一起配置心跳间隔与会话租约。租约需大于心跳间隔、最大随机抖动及 30 秒余量之和。较短租约回收异常席位更快,但允许的网络中断更短。

2. 启动时获取席位

从官网安装 SDK,通过 product.json 与客户授权码创建一个客户端。浮动启动必须获得在线授权,已保存的离线缓存不能代替会话获取。

下面 Go 片段放在返回 error 的应用函数中,需导入 context、os、os/signal 和 log。exportReport 是现有业务回调,customerKey 来自客户输入。

Go · 应用生命周期
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. 在两台不同设备验收

  1. 测试许可证设为一个浮动席位,在电脑 A 启动应用。
  2. 在电脑 B 启动,A 占用期间第二个受保护会话应拒绝。
  3. 正常退出 A,再确认 B 可以获得席位。
  4. 在隔离测试环境让 A 未清理退出,确认配置的租约过期后席位回收。

排查席位冲突

普通设备绑定与浮动退出规则不同:普通退出保留注册,浮动退出尝试归还席位。不要在普通应用每次关闭时解绑设备。

席位已占用可能是另一个运行实例,也可能是刚崩溃的进程等待租约过期。增加购买数量之前先查看控制台当前会话。

文件首次激活适用于设备绑定授权;即使浮动会话有效,计次操作也需要在线预留和结算。