Boa tarde!
Possuo uma rotina via schedule que tem controle de semáforo, onde ela cria um arquivo ao iniciar, deixa ele aberto enquanto processa e fecha assim que concluí o processo. Essa rotina executa de 10 em 10 minutos.
Dessa forma, se esse processamento demorar mais de 10 minutos e outro processo iniciar, caso ele não conseguir criar o arquivo, é porque ainda existe um processamento em aberto. Assim, essa segunda tentativa é abortada.
Acontece que de vez em quando essa rotina gera alguns error logs devido a cadastro incorreto, e devido ao error log, a rotina é encerrada antes de fechar o arquivo. Então, quando novos processos tentam ser executados, eles não conseguem pois o arquivo ainda está em aberto.
Gostaria de melhorar esse processo, de modo que mesmo que gere error log, o semáforo se feche.
Minha dúvida é se consigo executar um bloco de Begin Sequence, que caso ocorra um erro no processo, eu consiga fechar o arquivo antes de finalizar a rotina.
Caso não existir, alguém sabe de alguma forma mais inteligente e eficaz para realizar este controle de semáforo?
Agradeço desde já pela atenção.
Giordano, boa tarde.
Tente utilizar a função ErrorBlock, acredito que ela possa lhe ajudar no que você precisa.
Link TDN: http://tdn.totvs.com/display/tec/ErrorBlock
Tem também essa outra: http://tdn.totvs.com/display/tec/SysErrorBlock
Interessante Felipe, vou dar uma olhada! Obrigado.
Em anexo tem um exemplo (T75RUN.prw) utilizando BEGIN SEQUENCE (espécie de Try/Catch do ADVPL) em conjunto com a função ErrorBlock() indicada pelo Felipe Caiado Almeida.
Nele você pode simular um erro e ver que a conexão não é derrubada e o motivo do erro é retornado na variável cError (por meio da bError).
Tem também esse exemplo da página BlackTDN que exemplifica como utilizar para recuperação automática de erros:
TRY/CATCH/END: Quando utilizar?
Atenção: Esta publicação foi transferida automaticamente do fórum antigo, mas os anexos não foram incluídos.
Boa noite, Guilherme! Estava fazendo uns testes com Begin Sequence e aparentemente vai servir. Sabe me confirmar qual é o comportamento dele com o Final? O Final executa as tratativas informadas no Recover?
Boa tarde Giordano, assim como o Felipe indicou, você terá de utilizar do Begin Sequence/End Sequence, porém esse tratamento não segura todas as exceções, mesmo com tal tratamento, existem exceções que o binário aborta a thread, portanto não é um método 100% eficaz.
Acredito que seu controle de lock, semáforo e tratamento de exceção possa ser resolvido pela função LockByName:
http://tdn.totvs.com/pages/releaseview.action?pageId=6814894
Muito cuidado ao utilizar a função SysErrorBlock, você pode remover o tratamento de erro default do Protheus e as consequências são diversas.
Boa noite, Daniel! Estava fazendo uns testes com Begin Sequence e aparentemente vai servir. Sabe me confirmar qual é o comportamento dele com o Final? O Final executa as tratativas informadas no Recover?
Você se refere a função Final da LIB?
A função Final tem um comportamento diferente quando não existe interface, se for utilizar dela, utilize fora do seu Begin Sequence, aí ela trata de encerrar a thread.
Entendi, Daniel. Mas digo por exemplo: Estou colocando meu Begin Sequence chamando uma Static Function, dentro dessa função está ocorrendo um Final ao invés de um error log. O comportamento do Recover do Begin Sequence é executado normalmente? Ou a thread finaliza antes?
A função Final vai tentar encerrar a thread via exceção, se você capturar o bloco de erro via Begin Sequence, a thread não será finalizada, porém se essa mesma função é chamada via interface, a final força o encerramento mesmo com blocos de erro.
Show! Obrigado pela explicação, Daniel.