Páginas filhas
  • LGX - LTHREAD

Executa funções 4GL a partir de uma nova THREAD de forma assíncrona.


Hierarquia



Sintaxe


LET m_thread_reference = _ADVPL_create_component(NULL,"LTHREAD")


Métodos GET



Métodos acessíveis através da função _ADVPL_get_property que permite recuperar e manipular os valores do componente: 

Método GET: JOIN

Aguarda a finalização da THREAD.

Sintaxe



_ADVPL_get_property(< l_reference >,"JOIN") => SMALLINT

Retorno



TipoDescrição
SMALLINTVerdadeiro para indicar a finalização da THREAD.

Exemplo



#------------------------------------------------------------------------------#
FUNCTION LTHREAD_getJOIN()
#------------------------------------------------------------------------------#
    DEFINE l_status SMALLINT
    
    # A partir deste ponto, a execução ficará "pausada" até que a execução da THREAD termine.
    LET l_status = _ADVPL_get_property(m_thread_reference,"JOIN")
END FUNCTION




Método GET: IS_ALIVE

Verifica se a THREAD atual está "viva", ou seja, em execução.

Sintaxe



_ADVPL_get_property(< l_reference >,"IS_ALIVE") => SMALLINT

Retorno



TipoDescrição
SMALLINTVerdadeiro se a THREAD atual está em execução.

Exemplo



#------------------------------------------------------------------------------#
FUNCTION LTHREAD_getISALIVE()
#------------------------------------------------------------------------------#
    DEFINE l_is_alive SMALLINT
    LET l_is_alive = _ADVPL_get_property(m_thread_reference,"IS_ALIVE")
END FUNCTION




Método GET: START

Cria e inicia a execução de uma nova THREAD.

Sintaxe



_ADVPL_get_property(< l_reference >,"START") => SMALLINT

Retorno



TipoDescrição
SMALLINTVerdadeiro se a THREAD foi criada e iniciada com sucesso.

Exemplo



#------------------------------------------------------------------------------#
FUNCTION LTHREAD_getSTART()
#------------------------------------------------------------------------------#
    DEFINE l_status  SMALLINT
    DEFINE l_message CHAR(200)
 
    # Define a função que será executada numa nova THREAD.
    CALL _ADVPL_set_property(m_thread_reference,"FUNCTION","LTHREAD_testFunction")
 
    # Adiciona os parâmetros que serão enviados para a função.
    CALL _ADVPL_set_property(m_thread_reference,"CLEAR_PARAMETERS")
    CALL _ADVPL_set_property(m_thread_reference,"ADD_PARAMETER",p_user CLIPPED)
    CALL _ADVPL_set_property(m_thread_reference,"ADD_PARAMETER",p_cod_empresa CLIPPED)
 
    LET l_status = _ADVPL_get_property(m_thread_reference,"START")
    
    IF  NOT l_status THEN
        LET l_message = _ADVPL_get_property(m_thread_reference,"ERROR_MESSAGE")
        CALL log0030_mensagem(l_message,"exclamation")
    END IF
END FUNCTION

Observação


  • Para recuperar a mensagem de erro, no caso da execução não ter sido iniciada, utilize o método ERROR_MESSAGE.




Método GET: ERROR_MESSAGE

Retorna a mensagem de erro ocorrida durante a criação ou execução da THREAD.

Sintaxe



_ADVPL_get_property(< l_reference >,"ERROR_MESSAGE") => CHAR

Retorno



TipoDescrição
CHARMensagem de erro detalhando a inconsistência ocorrida na execução da THREAD.

Exemplo



#------------------------------------------------------------------------------#
FUNCTION LTHREAD_getERRORMESSAGE()
#------------------------------------------------------------------------------#
    DEFINE l_status  SMALLINT
    DEFINE l_message CHAR(200)
 
    # Define a função que será executada numa nova THREAD.
    CALL _ADVPL_set_property(m_thread_reference,"FUNCTION","LTHREAD_testFunction")
  
    # Adiciona os parâmetros que serão enviados para a função.
    CALL _ADVPL_set_property(m_thread_reference,"CLEAR_PARAMETERS")
    CALL _ADVPL_set_property(m_thread_reference,"ADD_PARAMETER",p_user CLIPPED)
    CALL _ADVPL_set_property(m_thread_reference,"ADD_PARAMETER",p_cod_empresa CLIPPED)
 
    LET l_status = _ADVPL_get_property(m_thread_reference,"START")
     
    IF  NOT l_status THEN
        LET l_message = _ADVPL_get_property(m_thread_reference,"ERROR_MESSAGE")
        CALL log0030_mensagem(l_message,"exclamation")
    END IF
END FUNCTION




Método GET: DEBUG_MODE

Retorna o modo de DEBUG atual em uso pela THREAD a ser executada.

Sintaxe



_ADVPL_get_property(< l_reference >,"DEBUG_MODE") => SMALLINT

Retorno



TipoDescrição
SMALLINTModo de DEBUG em uso para a Thread.

Exemplo



#------------------------------------------------------------------------------#
FUNCTION LTHREAD_getDebugMode()
#------------------------------------------------------------------------------#
    DEFINE l_debugMode SMALLINT
    LET l_debugMode = _ADVPL_get_property(m_thread_reference,"DEBUG_MODE")
END FUNCTION




Método GET: DEBUG_PATH

Retorna a pasta de destino, no disco do servidor onde o AppServer está em execução, para geração do arquivo de LOG com mensagens de DEBUG durante a execução da função na nova THREAD.

Sintaxe



_ADVPL_get_property(< l_reference >,"DEBUG_PATH") => CHAR

Retorno



TipoDescrição
CHARCaminho completo da pasta no Servidor de Aplicação onde o arquivo de LOG DEBUG deve ser gerado. 

Exemplo



#------------------------------------------------------------------------------#
FUNCTION LTHREAD_getDebugPath()
#------------------------------------------------------------------------------#
    DEFINE l_debugMode CHAR(300)
    LET l_debugPath = _ADVPL_get_property(m_thread_reference,"DEBUG_PATH")
END FUNCTION




Método GET: RETURN_VALUE

Recupera o retorno da função executada pela nova Thread quando a propriedade WAIT_RUN estiver com valor TRUE, indicando que deverá aguardar o término da execução da função da Thread.

Sintaxe



_ADVPL_get_property(< l_reference >,"RETURN_VALUE") => UNDEFINED

Retorno



TipoDescrição
UNDEFINEDRecupera o valor retornado pela função indicada na execução da Thread, podendo ser do tipo DATE, CHAR, INTEGER, etc.

Exemplo



#------------------------------------------------------------------------------#
FUNCTION LTHREAD_getReturnValue()
#------------------------------------------------------------------------------#
    DEFINE l_value  CHAR(30)
    DEFINE l_status SMALLINT

    LET l_status = _ADVPL_get_property(m_thread_reference,"START")
     
    IF  NOT l_status THEN
        LET l_message = _ADVPL_get_property(m_thread_reference,"ERROR_MESSAGE")
        CALL log0030_mensagem(l_message,"exclamation")
	ELSE
        LET l_value = _ADVPL_get_property(m_thread_reference,"RETURN_VALUE")
    END IF
END FUNCTION





Métodos SET



Métodos acessíveis através da função _ADVPL_set_property que permite alterar e manipular os valores do componente: 

Método SET: FUNCTION

Define a função que será executada em uma nova THREAD.

Sintaxe



CALL _ADVPL_set_property(< l_reference >,"FUNCTION", < l_function >, [< l_type >])

Parâmetros



NomeTipoDescriçãoObrigatório?Padrão
l_functionCHARFunção 4GL que será executada em uma nova THREAD.Sim
l_typeCHAR

Tipo da função a ser executada.

   4GL - Rotina com ou sem interface 4GL.

   INTEROP - Rotina com interface Metadado ou Freeform, onde a rotina está compilada como uma função 4GL.

   ADVPL - Rotina com ou sem interface ADVPL, onde a rotina principal está compilada como uma função ADVPL.

Não4GL

Exemplo



#------------------------------------------------------------------------------#
FUNCTION LTHREAD_setFUNCTION()
#------------------------------------------------------------------------------#
    CALL _ADVPL_set_property(m_thread_reference,"FUNCTION","LTHREAD_testFunction","INTEROP")
END FUNCTION




Método SET: CLEAR_ENVIRONMENTS

Limpa as variáveis de ambiente definidas anteriormente.

Sintaxe



CALL _ADVPL_set_property(< l_reference >,"CLEAR_ENVIRONMENTS")

Exemplo



#------------------------------------------------------------------------------#
FUNCTION LTHREAD_setCLEARENVIRONMENTS()
#------------------------------------------------------------------------------#
    CALL _ADVPL_set_property(m_thread_reference,"CLEAR_ENVIRONMENTS")
END FUNCTION




Método SET: ADD_ENVIRONMENT

Define uma nova variável de ambiente que será considerada na execução da nova THREAD.

Sintaxe



CALL _ADVPL_set_property(< l_reference >,"ADD_ENVIRONMENT", < l_variable >, < l_value >)

Parâmetros



NomeTipoDescriçãoObrigatório?Padrão
l_variable
CHARNome da variável de ambiente.Sim
l_value
CHARValor da variável de ambiente.Sim

Exemplo



#------------------------------------------------------------------------------#
FUNCTION LTHREAD_setADDENVIRONMENT()
#------------------------------------------------------------------------------#
    CALL _ADVPL_set_property(m_thread_reference,"ADD_ENVIRONMENT","NUM_PROCESSO","00123")
END FUNCTION




Método SET: CLEAR_PARAMETERS

Limpa os parâmetros definidos anteriormente.

Sintaxe



CALL _ADVPL_set_property(< l_reference >,"CLEAR_PARAMETERS")

Exemplo



#------------------------------------------------------------------------------#
FUNCTION LTHREAD_setCLEARPARAMETERS()
#------------------------------------------------------------------------------#
    CALL _ADVPL_set_property(m_thread_reference,"CLEAR_PARAMETERS")
END FUNCTION




Método SET: ADD_PARAMETER

Adiciona um novo parâmetros que será enviado para a função definida para execução em uma nova THREAD.

Sintaxe



CALL _ADVPL_set_property(< l_reference >,"ADD_PARAMETER", < l_value >)

Parâmetros



NomeTipoDescriçãoObrigatório?Padrão
l_value
CHARValor do parâmetro.Sim

Exemplo



#------------------------------------------------------------------------------#
FUNCTION LTHREAD_setADDPARAMETER()
#------------------------------------------------------------------------------#
    CALL _ADVPL_set_property(m_thread_reference,"ADD_PARAMETER","admlog")
END FUNCTION




Método SET: PROCESS_TYPE

Define o tipo da função que será executada em uma nova THREAD.

Sintaxe



CALL _ADVPL_set_property(< l_reference >,"PROCESS_TYPE", < l_type >)

Parâmetros



NomeTipoDescriçãoObrigatório?Padrão
l_typeCHAR

Tipo da função a ser executada.

   4GL - Rotina com ou sem interface 4GL.

   INTEROP - Rotina com interface Metadado ou Freeform, onde a rotina está compilada como uma função 4GL.

   ADVPL - Rotina com ou sem interface ADVPL, onde a rotina principal está compilada como uma função ADVPL.

Sim4GL

Exemplo



#------------------------------------------------------------------------------#
FUNCTION LTHREAD_setProcessType()
#------------------------------------------------------------------------------#
    CALL _ADVPL_set_property(m_thread_reference,"PROCESS_TYPE","ADVPL")
END FUNCTION




Método SET: DEBUG_MODE

Define o modo de DEBUG assumido durante a execução da função na nova THREAD.

Sintaxe



CALL _ADVPL_set_property(< l_reference >,"DEBUG_MODE", < l_debug_mode >)

Parâmetros



NomeTipoDescriçãoObrigatório?Padrão
l_debug_modeSMALLINT

Indicador de geração de LOG de mensagens para o processamento realizado durante a Thread.

0 - (PADRÃOInativo.

1 - DEBUG SQL + DEBUG Framework. Ativo para geração de instruções SQLs executadas durante o processamento das aplicações e ativo também para geração de mensagens de Debug emitidas pela função LOG_consoleDebugMessage.

2 - PROFILER + DEBUG Framework. Ativo para geração de instruções PROFILER, utilizado para avaliar performance de processamento das aplicações e ativo também para geração de mensagens de Debug emitidas pela função LOG_consoleDebugMessage.

3 - DEBUG Framework. Ativo para geração de mensagens de Debug emitidas pela função LOG_consoleDebugMessage.

Para mais informações a respeito do modo de debug, acesse Chaves de Profile - Geração de LOG com Debug - Chave LOGIX.DEBUG

Sim4GL

Exemplo



#------------------------------------------------------------------------------#
FUNCTION LTHREAD_setDebugMode()
#------------------------------------------------------------------------------#
    #Ativar o modo DEBUG para 1 (DEBUG SQL + DEBUG Framework)
    CALL _ADVPL_set_property(m_thread_reference,"DEBUG_MODE",1)
END FUNCTION




Método SET: DEBUG_PATH

Define a pasta de destino, no disco do servidor onde o AppServer está em execução, para geração do arquivo de LOG com mensagens de DEBUG durante a execução da função na nova THREAD.

Sintaxe



CALL _ADVPL_set_property(< l_reference >,"DEBUG_PATH", < l_debug_path >)

Parâmetros



NomeTipoDescriçãoObrigatório?Padrão
l_debug_pathCHAR

Caminho completo da pasta no Servidor de Aplicação onde o arquivo de LOG DEBUG deve ser gerado. 

Por padrão de desenvolvimento a pasta de destino SEMPRE deverá estar localizada numa subpasta abaixo da pasta indicada como ROOTPATH do AppServer.

Sim


Exemplo



#------------------------------------------------------------------------------#
FUNCTION LTHREAD_setDebugPath()
#------------------------------------------------------------------------------#
    CALL _ADVPL_set_property(m_thread_reference,"DEBUG_PATH","c:\\totvs\\logix\\temp\\log\\debug\\arquivolog.log")
END FUNCTION




Método SET: ENVIRONMENT

Define o ambiente em que a nova THREAD deverá ser executada no AppServer, caso exista necessidade de indicar um ambiente diferente do ambiente atual em que o processo está em execução.

Sintaxe



CALL _ADVPL_set_property(< l_reference >,"ENVIRONMENT", < l_environment >)

Parâmetros



NomeTipoDescriçãoObrigatório?Padrão
l_environmentCHAR

Nome do ambiente onde a execução da nova Thread será realizada no AppServer.

(seleção) Este método somente é utilizado quando houver necessidade de executar uma função/processo em um ambiente diferente do ambiente atual em uso/execução.

Sim

Exemplo



#------------------------------------------------------------------------------#
FUNCTION LTHREAD_setEnvironment()
#------------------------------------------------------------------------------#
    #Ajustar para que a nova thread seja executada no ambiente [integracoes] configurado no arquivo INI do AppServer em uso.
    CALL _ADVPL_set_property(m_thread_reference,"ENVIRONMENT","integracoes")
END FUNCTION




Método SET: WAIT_RUN

Define se deve aguardar ou não o término da execução da função indicada na Thread antes de continuar a executar as próximas instruções.

Sintaxe



CALL _ADVPL_set_property(< l_reference >,"WAIT_RUN", < l_wait_run >)

Parâmetros



NomeTipoDescriçãoObrigatório?Padrão
l_wait_runSMALLINT

Indicador para aguardar ou não o término de execução da Thread para continuar a executar as próximas instruções.

   TRUE - Aguardar o término da execução da função indicada na Thread.

   FALSE - Não aguardar o término da execução da função indicada na Thread. Neste caso, ao invocar o método START, o processo não irá aguadar o término da Thread para continuar processando as demais instruções da rotina em execução. 

SimFALSE

Exemplo



#------------------------------------------------------------------------------#
FUNCTION LTHREAD_setWaitRun()
#------------------------------------------------------------------------------#
    CALL _ADVPL_set_property(m_thread_reference,"WAIT_RUN","FALSE")

    CALL _ADVPL_set_property(m_thread_reference,"START")

    #Como foi indicada propriedade WAIT_RUN como FALSE para a nova thread, ao iniciar a execução da nova thread usando a propriedade START, 
    #o processo não irá aguardar o término da execução da função da nova thread para continuar a executar as próximas instruções após START.
    ...instruções após START...
END FUNCTION




Método SET: ADD_FINISH_EVENT

Adiciona uma função 4GL a ser executa após o término da execução da função indicada para a nova THREAD,ou seja, antes de finalizar a nova Thread todas funções adicionadas através desta propriedade serão executadas.

Sintaxe



CALL _ADVPL_set_property(< l_reference >,"ADD_FINISH_EVENT", < l_function >)

Parâmetros



NomeTipoDescriçãoObrigatório?Padrão
l_functionCHAR

Nome do função 4GL que será executada ao término da execução da função indidada para a nova Thread.

(seleção) Esta função é executada ainda na Thread, antes dela ser finalizada no AppServer.

Sim

Exemplo



#------------------------------------------------------------------------------#
FUNCTION LTHREAD_setAddFinishEvent()
#------------------------------------------------------------------------------#
    #Acionar a função xxxnnnn_finishThread() antes de finalizar a Thread no AppServer.
    CALL _ADVPL_set_property(m_thread_reference,"ADD_FINISH_EVENT","xxxnnnn_finishThread")
END FUNCTION





Observações


  • É possível determinar a quantidade máxima de THREADs que serão executadas a partir de uma THREAD pai, para não sobrecarregar o servidor de aplicação, através da Chave de PROFILE logix.threads.max.
  • É possível emitir mensagens de LOG específicas deste componente, auxiliando em testes ou em resoluções de problemas, para isso a chave de PROFILE logix.threads.debug precisa estar definida com o valor 1 (ligado).



Exemplo


Clique no link na lateral direita para expandir o código de exemplo.

Código de exemplo do componente LThread
DATABASE logix

GLOBALS
    DEFINE p_user LIKE usuarios.cod_usuario
    DEFINE p_cod_empresa LIKE empresa.cod_empresa
END GLOBALS

#------------------------------------------------------------------------------#
FUNCTION LTHREAD_test()
#------------------------------------------------------------------------------#
    DEFINE l_thread_reference VARCHAR(10)
 
    DEFINE l_status   SMALLINT
    DEFINE l_is_alive SMALLINT
    DEFINE l_message  CHAR(200)

    IF  LOG_initApp("PADRAO") <> 0 THEN
        RETURN
    END IF

    # Cria o componente para requisições REST.
    LET l_thread_reference = _ADVPL_create_component(NULL,"LTHREAD")

    # Define a função que será executada numa nova THREAD.
    CALL _ADVPL_set_property(l_thread_reference,"FUNCTION","LTHREAD_testFunction")

    # Adiciona os parâmetros que serão enviados para a função.
    CALL _ADVPL_set_property(l_thread_reference,"CLEAR_PARAMETERS")
    CALL _ADVPL_set_property(l_thread_reference,"ADD_PARAMETER",p_user CLIPPED)
    CALL _ADVPL_set_property(l_thread_reference,"ADD_PARAMETER",p_cod_empresa CLIPPED)

    # Inicia a execução da função em uma nova THREAD.
    LET l_status = _ADVPL_get_property(l_thread_reference,"START")

    IF  l_status THEN
        # Verifica se a THREAD está em execução.
        LET l_is_alive = _ADVPL_get_property(l_thread_reference,"IS_ALIVE")

        IF  l_is_alive THEN
            CALL log0030_mensagem("Is Alive? Sim!","info")
        ELSE
            CALL log0030_mensagem("Is Alive? Não!","excl")
        END IF

        # Aguarda até o término da THREAD.
        CALL _ADVPL_get_property(l_thread_reference,"JOIN")
        CALL log0030_mensagem("THREAD finalizada","info")
    ELSE
        # Recupera a mensagem de erro.
        LET l_message = _ADVPL_get_property(l_thread_reference,"ERROR_MESSAGE")
        CALL log0030_mensagem(l_message,"stop")
    END IF

    # Ao finalizar o uso, libera o componente da memória.
    CALL _ADVPL_destroy_component(l_thread_reference)
END FUNCTION

#------------------------------------------------------------------------------#
FUNCTION LTHREAD_testFunction(l_cod_usuario,l_cod_empresa)
#------------------------------------------------------------------------------#
    DEFINE l_val_env     CHAR(50)
    DEFINE l_cod_usuario CHAR(08)
    DEFINE l_cod_empresa CHAR(02)

    IF  LOG_initApp("PADRAO") = 0 THEN
        LET l_val_env = LOG_getEnv("IPLOCAL_LGX")
        CALL CONOUT("IPLOCAL_LGX: "||l_val_env CLIPPED)

        LET l_val_env = LOG_getEnv("LTHREAD_CMP")
        CALL CONOUT("LTHREAD_CMP: "||l_val_env CLIPPED)

        CALL CONOUT("USUARIO....: "||l_cod_usuario CLIPPED)
        CALL CONOUT("EMPRESA....: "||l_cod_empresa CLIPPED)

        # Aguarda 5 segundos para que o teste do IS_ALIVE funcione.
        SLEEP 5
    END IF
END FUNCTION