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


Abaixo segue um exemplo de como deve ser implementado o código para uso da funcionalidade POOL Job Threads por um aplicação desenvolvida para o Logix em linguagem Totvstec 4GL.

Esta funcionalidade atualmente não está disponível de forma automática nos programas, ou seja, é adaptar as rotinas do produto que são elegidas a terem processamento MULTI-THREADS que precisem que seu processamento possa ser distribuído em mais AppServers.

PASSO A PASSO

A funcionalidade POOL Job Threads está disponível para uso a partir do Logix 12.1.26.


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:

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:

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.


Desenvolvimento no fonte 4GL


Implementar no código do fonte 4GL as chamadas das funções POOLJOBS_<funcao> conforme o trecho de código abaixo:

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 um exemplo completo acesse a documentação da função PoolJobs_runProcess.



Acompanhamento da execução em ambiente de desenvolvimento a partir do banco de dados

Para realizar acompanhamento das execuções dos Jobs durante o processamento da rotina, pode-se executar uma instrução SQL diretamente no banco de dados, utilizando uma ferramenta de consulta SQL de uso comum no desenvolvimento do produto Logix, pois todos as JOB Threads tem dados devidamente registrados na tabela LOG_DADOS_SESSAO_LOGIX, com a identificação do nome do POOL para o qual foram iniciados entre outras informações.


INFORMIX
SELECT sid, dat_execucao, programa, origem 
  FROM log_dados_sessao_logix
 WHERE programa LIKE '<programa>%'
   AND EXISTS (SELECT 1 FROM sysmaster:sysscblst ss WHERE ss.sid = log_dados_sessao_logix.sid)
 ORDER BY dat_execucao
ORACLE
SELECT * 
  FROM log_dados_sessao_logix
 WHERE programa LIKE '<programa>%'
   AND EXISTS (SELECT 1 FROM GV$SESSION WHERE audsid = log_dados_sessao_logix.sid)
ORDER BY dat_execucao
SQLSERVER
SELECT * 
  FROM log_dados_sessao_logix
 WHERE programa LIKE '<programa>%'
   AND EXISTS (SELECT 1 
                 FROM sys.dm_exec_sessions ss
                WHERE ss.session_id = log_dados_sessao_logix.sid
                  AND CAST(convert(varchar(19),ss.login_time,121) AS DATETIME2(0)) = 
                      log_dados_sessao_logix.dat_execucao)
ORDER BY dat_execucao


A cada execução da instrução acima, conforme o banco de dados em uso, pode-se observar os processos do POOL Job Threads que está em andamento. 

Substitua na query SQL o conteúdo da TAG <programa>, que é o nome do programa que aciona a função POOLJOBS_runProcess() para que a pesquisa apresente corretamente a lista de Job Threads em execução pelo programa desejado.


Acompanhamento da execução em ambiente de desenvolvimento a partir do CONSOLE do AppServer

A partir do arquivo de LOG do TotvsAppserver onde o programa principal que iniciou/executou os processos do POOL Job Threads, é possível acompanhar mensagens de LOG de processamentos das funções POOLJOBS. 

Todas as mensagens relacionadas ao POOLJOBS são identificadas com a TAG [POOLJOBS], mas para gerar estas mensagens no LOG do AppServer é necessário ativar as seguintes chaves de DEBUG no arquivo de profile do AppServer:

logix.debug = 1
logix.source.debug = 1


Exemplos de mensagens geradas no LOG do Appserver para a execução das funções POOJOBS:

[POOLJOBS][GETCOUNTPROCESS] POOL:POOL_50 processo:  TOTAL = 0

[POOLJOBS][INIT] POOL: POOL_50 - Lista de Slaves [192.168.99.1:7091,192.168.99.1:7092,192.168.99.1:7093]

[POOLJOBS][INIT] POOL: POOL_50 - Intervalo para leitura de processos [5]

[LOGIX] ERRO: [POOLJOBS][INIT] JOB Servers POOL POOL_50 - Slave 192.168.99.1:7093 está inativo.

[POOLJOBS][INIT] JOB Servers POOL POOL_50 - Total slaves [3]

[POOLJOBS][RUNPROCESS] INICIO - POOL POOL_50 - Processo: POOL4_MAIN Empresa: 50 Usuario: cleane 

[POOLJOBS][RUNPROCESS] POOL:POOL_50 - Conectando no SLAVE 192.168.99.1 PORT 7092

[POOLJOBS][RUNPROCESS] POOL POOL_50 - Processo: POOL3_MAIN - Processo não iniciado, pois processos em paralelo atingiram o limite (1).

[POOLJOBS][GETCOUNTPROCESS] POOL:POOL_50 processo: POOL4_MAIN TOTAL = 1