Páginas filhas
  • LGX - Exemplo de uso POOL Job Threads

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

PASSO A PASSO


draw.io DiagramborderfalseviewerToolbartruefitWindowfalsediagramDisplayNamelboxtruerevision1diagramNamenumber2simpleViewerfalsewidth100linksautotbstyletopdiagramWidth126

Configurar chave de profile

Configurar chave de profile "logix.pooljobs.servers" para o programa que executa a função para iniciar o
POOL de JOBS ou NOME DO POOL de Jobs desejado.

Exemplo:

Bloco de código
logix.pooljobs.servers.esp9900=192.168.99.1:7091,192.168.99.1:7092


Neste caso a chave foi configurada para o <PROGRAMA> esp9900, definindo que existirá apenas um único POOL de AppServers que atenderá o processamento multi-threads utilizando as funções POOL Job Threads.


Pode-se definir também mais de um POOL para o mesmo programa, como por exemplo "POOL por empresa".

Exemplo:

esp9900_01 e esp9900_02


No arquivo de profile as chaves seriam definidas da seguinte forma:

Bloco de código
logix.pooljobs.servers.esp9900_01=192.168.99.1:7091,192.168.99.1:7092

logix.pooljobs.servers.esp9900_02=192.168.99.1:7093,192.168.99.1:7094


Onde esp9900_01 seria um POOL Job Threads para empresa "01" e esp9900_02 seria um POOL Job Threads para empresa "02", ou seja, existirá um pool de appsevers para atender a um processamento de Job Threads para empresa 01 e outro para empresa 02 e cada um utiliza 2 slaves/appservers distintos para distribuição dos processos paralelos durante a execução.

Se o programa iniciar o POOL (função POOLJOBS_init), com o nome esp9900_01 e este nome estiver definido no arquivo de profile com uma lista de appservers válidos, irá utilizar a lista de appservers definida para a chave logix.pooljobs.servers.esp9900_01.

Caso a chave logix.pooljobs.servers.esp9900_01 não esteja definida no arquivo de profile, a função PoolJobs_init() irá rastrear automaticamente a chave com a lista de AppServers do POOL Job Threads para o programa que está invocando a função POOLJOBS_init, ou seja, neste caso, se o programa for esp9900.4gl, irá procurar a lista de AppServers definidos para a chave logix.pooljobs.servers.esp9900, que se encontrada, será adotada como a lista de servers para processar o POOL nomeado como esp9900_01. 

Se não existir chave definida para o nome do POOL, nem para o programa que iniciou o POOL, o sistema tentará obter a lista de AppServers da chave padrão logix.pooljobs.servers.

Se a lista de AppServers ainda não foi identificada, por não estar definida para nenhuma das situações citadas anteriormente, o sistema irá assumir o AppServer atual em uso pela aplicação que iniciou o POOL para realizar a execução dos processos em modo JOB.

draw.io DiagramborderfalseviewerToolbartruefitWindowfalsediagramDisplayNamelboxtruerevision1diagramNamenumber2_1simpleViewerfalsewidth100linksautotbstyletopdiagramWidth126


Desenvolvimento no fonte 4GL


Implementar no código do fonte 4GL as chamadas das funções POOLJOBS_<funcao> conforme um exemplo abaixo.

Bloco de código
languageruby
linenumberstrue
DEFINE m_pooljob_name CHAR(30)

LET m_pooljob_name = "esp9900"

IF _ADVPL_PoolJobs_getCountProcess(m_pooljob_name) > 0 THEN
   CALL LOG_Message("POOL JOBS","ERROR","Este processo já está em andamento.")
   RETURN 
END IF

IF NOT _ADVPL_PoolJobs_init(m_pooljob_name) THEN
   CALL LOG_message("POOL JOBS","ERROR","Falha ao iniciar o POOL de appserver JOBS.","Lista de appservers da chave logix.jobServers para o programa estão inativos ou não foram configurados.",0) 
   RETURN 
END IF

IF _ADVPL_PoolJobs_runProcess(m_pooljob_name,"log001_processo_01") THEN
   CALL conout("Processo 01 iniciado ou já alcançou limites de processos paralelos em andamento.")
ELSE
   CALL conout("Processo 01 não iniciado. Falha de conexão.")
END IF

IF _ADVPL_PoolJobs_runProcess(m_pooljob_name,"log001_processo_02") THEN
   CALL conout("Processo 02 iniciado ou já alcançou limites de processos paralelos em andamento.")
ELSE
   CALL conout("Processo 02 não iniciado. Falha de conexão.")
END IF

IF _ADVPL_PoolJobs_runProcess(m_pooljob_name,"log001_processo_03") THEN
   CALL conout("Processo 03 iniciado ou já alcançou limites de processos paralelos em andamento.")
ELSE
   CALL conout("Processo 03 não iniciado. Falha de conexão.")
END IF

IF _ADVPL_PoolJobs_runProcess(m_pooljob_name,"log001_processo_04") THEN
   CALL conout("Processo 04 iniciado ou já alcançou limites de processos paralelos em andamento.")
ELSE
   CALL conout("Processo 04 não iniciado. Falha de conexão.")
END IF


Para outros exemplos, acesse a documentação das funções POOL Job Threads.


Acompanhamento da execução em ambiente de desenvolvimento

Para realizar acompanhamento das execuções dos Jobs durante o processamento da rotina, pode-se realizar um filtro diretamente no banco de dados, pois todos os Jobs estão devidamente registrados na tabela LOG_DADOS_SESSAO_LOGIX, com a identificação do nome do POOL para o qual foram iniciados.


Bloco de código
languagesql
titleINFORMIX
SELECT sid, dat_execucao, programa, origem FROM log_dados_sessao_logix
 WHERE programa LIKE 'pool%'
   AND EXISTS (SELECT 1 
                 FROM sysmaster:syssessions 
                WHERE sid = log_dados_sessao_logix.sid)
 ORDER BY dat_execucao
Bloco de código
languagesql
titleORACLE
SELECT * FROM log_dados_sessao_logix
 WHERE programa LIKE 'pool%'
   AND EXISTS (SELECT 1 FROM GV$SESSION WHERE audsid = log_dados_sessao_logix.sid)
ORDER BY dat_execucao
Bloco de código
languagesql
titleSQLSERVER
SELECT * FROM log_dados_sessao_logix
 WHERE programa LIKE 'pool%'
   AND EXISTS (SELECT 1 
                 FROM sys.dm_exec_sessions 
                WHERE session_id = log_dados_sessao_logix.sid
                  AND CAST(login_time AS DATETIME2(0)) = 
                      log_dados_sessao_logix.dat_execucao)
ORDER BY dat_execucao