Edson,
Você pode proteger uma execução com a função LockByName
. Essa função cria um semáforo diretamente no License Server. Ela permite fazer um semáforo para todo o ambiente, por grupo de empresas e até mesmo no nível de filial.
Caso você queira que somente uma thread execute essa rotina, e caso ela seja chamada novamente, não seja executada, você pode proteger ela usando o LockByName
, veja esse exemplo:
Método do REST que vai disparar a execução da rotina:
//-------------------------------------------------------------------
/*/{Protheus.doc} post
REST para execução da rotina Xisto
@author Daniel Mendes
@since 25/09/2020
@version 1.0
/*/
//-------------------------------------------------------------------
wsmethod post wsservice restXisto
startjob("u_xisto", getEnvServer(), .F.)
return .T.
Função de processamento pesado, que é disparada pelo REST
//-------------------------------------------------------------------
/*/{Protheus.doc} xisto
Rotina para processamento XPTO...
@sample u_xisto()
@author Daniel Mendes
@since 25/09/2020
@version 1.0
/*/
//-------------------------------------------------------------------
function u_xisto()
//Cria o semáforo, dessa forma o semáforo será no ambiente inteiro
if LockByName("XISTO", .F., .F.)
//Processamentos etc...
//Após finalizar tudo, libero o semáforo
UnLockByName("XISTO", .F., .F.)
else
ConOut("A rotina XISTO ja encontra-se em execução")
endif
return
Documentações:
https://tdn.totvs.com/pages/releaseview.action?pageId=6814894
https://tdn.totvs.com/display/framework/Bloqueio+de+processamento
https://tdn.totvs.com/pages/releaseview.action?pageId=6814897
Você quer que seja executada apenas 1 thread? Quer também dar um status da execução, tipo 30%, 50%, 70% ?
— Marcos Felipe Rezende Xavier 25 de Sep de 2020Rezende, gostaria que aquela função fosse executada somente por 1 thread, não precisa status ela roda em JOB.
— Edson Maurcio Gonçalves 25 de Sep de 2020