1. Defina um limite de assentos simultâneos
Os lugares flutuantes contam hardware com concessões válidas. Sessões no mesmo hardware partilham um lugar; sem identidade de hardware, usa-se o ID do dispositivo.
Defina o intervalo de pulsação e a concessão da sessão juntos. A locação deve exceder o intervalo de pulsação mais seu jitter máximo e uma margem de 30 segundos. Um contrato de locação de curta duração recupera assentos abandonados mais rapidamente, mas tolera menos interrupções na rede.
O limite de lugares da licença e a quota de dispositivos do espaço de trabalho são distintos. Ambos os tipos de licença ocupam quota pelas ativações atualmente válidas.
A cota conta as ativações atuais e retorna ao liberá-las. Licenças comuns continuam contando offline; licenças flutuantes também devolvem a cota quando a concessão expira.
Mesmo após usar 10 dispositivos, ocupa no máximo 3 unidades se libertar primeiro cada dispositivo substituído e mantiver no máximo 3 ativações válidas.
2. Adquira um assento na inicialização
Copie o ID do produto em Console > Produtos. Abra as chaves públicas de assinatura do mesmo produto e insira todos os pares ID da chave/chave pública no código de inicialização, substituindo YOUR_PRODUCT_ID, YOUR_KEY_ID e YOUR_PUBLIC_KEY. A integração rápida pode gerar esse código. Não é necessário um arquivo de configuração; o SDK usa https://www.licentivo.com por padrão.
O seguinte fragmento Go pertence a uma função de aplicativo que retorna erro. Ele precisa de importações de contexto, sistema operacional, sistema operacional/sinal e log. exportReport é o retorno de chamada de sua empresa existente; customerKey vem do formulário de ativação.
ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt)
defer stop()
client, err := licentivo.OpenProduct(ctx, productID, trustedKeys, 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. Deixe o SDK agendar heartbeats
Não escreva seu próprio cronômetro nem envie solicitações de pulsação paralelas HTTP. O SDK utiliza o intervalo autorizado e renova a sessão. Mantenha o cliente ativo enquanto o aplicativo está em execução.
Coloque RunFeature em cada manipulador protegido. Se uma verificação for negada, interrompa a ação protegida e mostre uma mensagem de licenciamento. Exibir erros úteis de conexão em segundo plano; não presuma que uma verificação de inicialização autoriza permanentemente operações posteriores.
Um arrendamento expirado, licença revogada ou recusa de assento são tratados pelas regras de autorização assinadas. A reconexão requer uma verificação de servidor bem-sucedida. Nunca estenda uma sessão editando dados de expiração locais.
4. Solte em uma saída normal
Feche o cliente ao encerrar normalmente. Go usa defer client.Close(); Java e C# liberam os recursos ao final de um escopo, C++ e Rust usam destrutores, Python usa um gerenciador de contexto e Ruby e JavaScript oferecem close.
Se o aplicativo travar ou não conseguir entrar em contato com o servidor durante o desligamento, o servidor recuperará o assento abandonado quando a concessão da sessão expirar. Esse atraso é esperado; mantenha uma mensagem clara para que outro usuário saiba quando um assento poderá ficar disponível.
As licenças flutuantes contam concessões válidas. Desligar a rede ou uma falha não devolve capacidade imediatamente; a última sessão tem de ser libertada ou expirar.
5. Teste com duas máquinas separadas
- Defina uma licença de teste para um assento flutuante. Inicie o aplicativo no computador A.
- Inicie no computador B: a segunda sessão protegida deve ser negada enquanto A ocupa o assento.
- Saia de A normalmente e verifique se B pode adquirir um assento.
- No ambiente de teste isolado, pare A sem limpeza; verifique se o assento retorna após o término do aluguel configurado.
Solução de problemas de conflitos de assento
Os modos bloqueado por nó e flutuante têm comportamento de saída diferente: o desligamento bloqueado por nó mantém o registro, enquanto o desligamento flutuante tenta retornar um assento. Não chame a desvinculação do dispositivo sempre que um aplicativo bloqueado por nó for fechado.
Uma mensagem de assento em uso pode ser causada por outra instância em execução ou por um processo travado recentemente aguardando a expiração do arrendamento. Revise as sessões atuais no console antes de aumentar a contagem de licenças adquiridas.
A primeira ativação baseada em arquivo é para licenças bloqueadas por nó. As operações medidas ainda exigem reserva on-line e liquidação de chamadas, mesmo quando a própria sessão flutuante é válida.