Transforme seu Magic Batch Server num Magic Windows Service – Blog Magic Brasil
Transforme seu Magic Batch Server num Magic Windows Service
08/01/2015 02/09/2021 Manoel Frederico Silva Nenhum Comentário
Batch Server é uma técnica utilizada com Magic xpa para a programação de processos de negócio que devem executar no servidor, em paralelo às atividades dos demais usuários do sistema, e sem a interação destes.
O caminho natural (mais correto) para este tipo de programação no Magic xpa seria a criação de rotinas 'batch' para execução pelo Magic xpa Enterprise Server (licenças MGENT1 ou MGENT2) ou ter estas rotinas como um 'fluxo' de um projeto Magic xpi.
Na prática, porém, para simplificar o processo ou até aproveitar um ambiente Magic xpa já existente, muitos desenvolvedores partem mesmo para uma solução "alternativa" do modelo Batch Server, que se resume a dedicar uma máquina (estação ou servidor) para ficar executando uma rotina 'batch' ininterruptamente, e sem exigir interação do usuário:
É o famoso "inicie o sistema e deixe ele executando".
Esta arquitetura permite a utilização de um Magic xpa Open Client (licença MGCSRT) ou Magic xpa XPress (licença MGXRT) padrão.
Contudo, a não interação com o usuário não é 100%.
Ao menos para iniciar o projeto, é necessário alguém (um usuário) que 'dê o start' manualmente no Magic xpa.
E isso precisa ser feito através de uma sessão interativa, ou seja, este usuário precisa antes ter efetuado o seu 'login' no sistema operacional. E por conta disso, se efetuar o 'logoff' o Magic xpa para de executar (pois estava atrelado a esta sessão interativa do SO).
E caso a máquina seja reiniciada, todo o processo ('login' + 'start') precisa ser repetido.
Esta pode não ser uma solução 'elegante' para sistemas desta natureza.
Este tipo de aplicação deve idealmente ser definida com um 'serviço' do sistema operacional, para evitar estes transtornos. Os 'serviços' já são desenhados para executar automaticamente na inicialização da máquina, em segundo plano (background), sem requerer ação de pessoas.
Mas nem o Magic xpa Open Client (licença MGCSRT) ou Magic xpa XPress (licença MGXRT) podem ser executados como um serviço, segundo a sua arquitetura. Apenas o Magic Broker (usado no Magic xpa Enterprise Server e Magic xpa RIA Server) está tecnicamente preparado para isso, já que os softwares precisam ficar trocando mensagens especiais (CONTROL CODES) com o gerenciador de serviços, a respeito do seu funcionamento.
Entretanto, é possível contornar isto com um utilitário chamado Non-Sucking Service Manager ( nssm ).
Ele permite executar sistemas interativos como se fossem serviços não interativos. É desenvolvido para interagir com o gerenciador de serviços do SO (rodar como serviço) e sua única lógica é ativar (abrir) outro sistema para executar debaixo dele.
Como isso, podemos fazer os Batch Servers Magic xpa executarem como um serviço do sistema operacional.
Descompacte o NSSM num pasta qualquer, no mesmo servidor onde está instalado o Magic xpa que irá executar o sistema Batch Server:
Através da linha de comando (cmd), vá até a pasta 'win32' (porque o Magic xpa é um sistema 32 bits) e digite nssm install:
Isso nos dá acesso à interface de instalação do serviço.
Na pasta 'Application', teremos:
Path: Caminho completo do Magic xpa
Startup directory: Normalmente é a mesma pasta do Magic xpa, mas pode também ser a pasta onde está o MAGIC.INI.
Arguments: Todos os parâmetros que passaríamos ao Magic xpa no atalho podem ser informados aqui. Por exemplo:
/LicenseName=MGCSRT /DeploymentMode=O /InputPassword=N /StartApplication=C:\\MSE\\Magic\\xpa\\2.5a\\Projects\\BatchServerDEMO\\BatchServerDEMO.ecf /USER=BATCHSERVER
NOTA: O parâmetro /USER é para fazer logon automático no Magic xpa, quando as rotinas a serem executadas dependem de direitos (função RIGHTS) específicos, associados a um usuário. O logon automático só é possível quando o usuário está cadastrado sem senha.
Service name: É o nome do serviço que será criado no SO. Exemplo: MgcXpaBatchSrv.
Na pasta 'Details', teremos:
Display name e Description: Informações adicionais do serviço, que irão aparecer no gerenciador de serviços do SO.
Startup type: Tipo de inicialização do serviço (manual, automática, etc…).
Na pasta 'Shutdown', devemos controlar os timeouts de encerramento do processo Magic xpa, quando for realizado o STOP do nosso serviço. A intenção é dar tempo suficiente ao Magic xpa para encerrar seus programas, sem ultrapassar os valores default do SO (ex: 20s no MS-Windows).
Na pasta 'Exit actions', devemos controlar o que fazer caso o Magic xpa, termine (aborte) sua execução inesperadamente (sem ser por um comando STOP do nosso serviço). Em geral, escolhemos entre 'Restart application' (reiniciar o Magic xpa) ou 'Stop service' (fazer o serviço parar também). Vai depender da sua conveniência.
Na pasta 'Logon', podemos controlar as credenciais a serem usadas para a execução deste serviço.
Na pasta 'Environment', podemos acrescentar ou alterar variáveis de ambiente especificamente para o contexto deste serviço.
E existem ainda outros ajustes finos, disponíveis nas demais pastas.
Após a instalação do serviço (Install service):
Veremos que ele estará disponível no gerenciador de serviços do SO:
Se futuramente algumas das configurações precisarem ser alteradas, isso também pode ser feito diretamente pelo Registro do Sistema, na chave:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<seu_servico>
Quando este serviço é iniciado, veremos que o Magic xpa é executado como um sub processo do NSSM, com todos os argumentos eventualmente definidos:
Observe que nesta modalidade, nenhuma das janelas das rotinas 'batch' serão exibidas, mesmo que definidas como Open=YES. Isso porque todo serviço é executado pelo SO em sessões não interativas.
As rotinas 'batch' do sistema Batch Server devem estar sempre preparadas para resolverem sozinhas todas as exceções, sem apresentar MessageBox, InputBox ou qualquer outra interface interativa.
É importante também atentar para outras características específicas dos contexto de execução de serviços, como o fato que por padrão, serviços não conseguem acessar drives de rede mapeados (G:, J:, M:, etc). Estes drives de rede só conseguem ser acessados através do seu nome UNC, exemplo: \\<Servidor>\<SharedFolder>\<ResourceName>.