Preparando as Aplicações
Após muitos testes em nosso ambiente de desenvolvimento local, prepare os aplicativos que serão implantados no servidor de produção.
O primeiro aplicativo a modificar para suportar WebSockets é o FMSoft Customer Portal: https://prime.fmsoft.net/userv/mportal.dll

Atualmente o formulário principal mostra uma data/hora na barra de status que é atualizada a cada 30 segundos usando um UniTimer:

Remova o manipulador de evento do timer e altere o intervalo do timer para disparar apenas a cada 2 minutos (para manter a sessão ativa).

Objetivo: atualizar a data/hora usando mensagens WebSocket. Use um ThreadTimer em ServerModule para transmitir a data/hora a cada segundo. O cliente processará essa mensagem e atualizará a data/hora a partir do código do lado do cliente.

Acima: ThreadTimer transmitirá a data/hora uma vez por segundo.

Abaixo está o manipulador de evento do lado do servidor que transmite a data/hora para todos os clientes. Observação: a opção boClientOnly é usada para que o evento não dispare requisições Ajax; os eventos são processados no lado do cliente.
Adicione um manipulador de evento no lado do cliente ao formulário principal para processar a mensagem recebida e atualizar a barra de status:
Habilite o thread timer no código apenas quando este Node for o "Node Zero" do cluster. Use o evento OnClusterNodeIdChange (disparado quando NodeId ou ServerNodeId mudam e também chamado inicialmente quando o módulo é criado). Como ele pode ser chamado várias vezes, atribua diretamente à propriedade Enabled do timer.
O ThreadTimer deve ser habilitado apenas para o nó do cluster que é o Node Zero.
Exemplo de código de habilitação com logging de depuração opcional:
Ao verificar o arquivo de log do Node 0 você deve ver entradas semelhantes a:
mportal.exe: 00001AA0: 22:44:25 [TUniServerModule]:Node Id = 0
mportal.exe: 00001AA0: 22:44:25 [UniThreadTimer1]:Timer Enabled for Node: 0 -1
Testes em um PC local mostram que o timer está funcionando corretamente e as mensagens são processadas pelo manipulador de evento do lado do cliente.
