Árvore de páginas

Conceitos


O Schedule Protheus permite que rotinas do sistema sejam agendadas para que possam ser executadas posteriormente, em um período determinado pelo usuário. É possível definir quando (dias, horários e quantidades de execuções) e em qual Grupo de Empresas e Filiais o processo será executado. O Schedule Protheus não realiza nenhum processamento. Sua função é chamar a rotina agendada no momento definido ou manter esta rotina sendo executada constantemente, quando o agendamento é configurado como sempre ativo. Consumo de memória, desempenho e processamento são atributos associados a rotina agenda, e não ao Schedule Protheus em si.
O Schedule Protheus é composto por três componentes principais:

  • Manager: Componente responsável por fazer o gerenciamento das tarefas, como o controle de geração das tarefas (Task Manager) e o controle da fila das tarefas que serão executadas (Queue Manager);
  • Agent: Este é o componente que gerencia as execuções e distribuí as tarefas para que as Executes configuradas que estão disponíveis no momento. Os Agents podem estar localizados em servidores diferentes, possibilitando o balanceamento da carga de execuções;
  • Execute: São os componentes responsáveis por realizar a chamada das rotinas agendadas. A única das entidades que consome licença no Schedule Protheus, e isto ocorre na execução da rotina agendada.


Importante

A configuração do schedule Protheus deve ser realizada sempre em um único appserver. A configuração do Schedule gera informações de controle no arquivo appserver.ini acessado pela estação. Desta maneira ele sempre deve ser acessado pelo mesmo appserver que configurou o serviço. Preferêncialmente o Schedule deve ser configurado em um appserver isolado, e nunca dentro de um balance.

A tela pode sofrer alteração no modo de visualização de acordo com dispositivo no qual esta acessando a rotina, esse comportamento faz com que as barras de rolagem sejam habilitadas para melhor experiencia de navegação. 


Monitoramento dos serviços do Schedule Protheus

Existem dois serviços que estão configurados no Schedule Protheus.

  • Task Manager: Serviço de verificação de agendamentos. Este serviço é responsável por monitorar os agendamentos e gerar as tarefas para execução.
  • Queue Manager: Serviço de gerenciamento de filas. Este é o serviço que faz a distribuição das tarefas entre os Agents configurados.

Para visualizar estes serviços acesse o módulo Configurador (Sigacfg) e no menu acesse Ambiente/Schedule/Schedule (CFGA010):



Figura 1 - Task Manager e Queue Manager do Schedule Protheus. Serviços responsáveis por gerar e gerenciar a fila de tarefas.


Através desta interface é possível gerenciar os serviços. O primeiro botão permite iniciar todos os serviços de uma só vez. O segundo inicia o serviço no qual se está posicionado.
Já o terceiro botão para todos os serviços de uma vez e o quarto interrompe o serviço no qual se está posicionado.
Devido a complexidade de manipulação dos serviços existe um botão de atualização (quinto botão) que permite que esta interface seja atualizada. Para que o Schedule Protheus funcione estes dois serviços devem estar iniciados.

Monitoramento de Agents

Nesta visão são exibidas informações sobre o status dos Agents e também sobre os eventos de cada um.

Figura 2 - Monitor de Agents. Aqui são exibidos os seus status e a data e hora de última utilização de cada um.


O gerenciamento dos Agents cadastrados é realizado da seguinte maneira:
No primeiro botão superior é possível iniciar todos os Agents cadastrados. O segundo botão inicia somente o Agent no qual se está posicionado.
O terceiro botão interrompe o serviço de todos os Agents e o quarto botão interrompe somente o Agent no qual se está posicionado.
Para que as tarefas sejam executadas, é necessário que exista ao menos um Agent cadastrado com a empresa equivalente a tarefa, e este esteja inicializado.
Cadastrar os Agents é muito simples. Clicando em Agent/Cadastro a tela de cadastro é apresentada.


Figura 3- Tela de cadastro dos Agents do Schedule Protheus
Na barra superior no botão é possível incluir automaticamente um Agent para cada um dos grupos de empresas cadastrados no sistema. Cada Agent já vem configurado com duas Threads para execução das rotinas.
É possível incluir Agents de maneira manual. Para isso, na parte inferior, em Detalhes, clique em adicionar e inclua o Agent. É necessário definir um código para o Agent, seu nome, o IP, porta de comunicação e empresa na qual este Agent irá se conectar e o número de Threads disponíveis para execução das rotinas agendadas. É possível também desabilitar o Agent, caso necessário, ou ainda excluí-lo.
MUITO IMPORTANTE: É recomendável que seja utilizado sempre o endereço IP da máquina, e não o seu Alias de rede.
Exemplo: Utilize 172.16.32.111 ao invés de Maquina_001.
Dentro de Agent/Monitor é possível monitorar o Agent posicionado.


Figura 4 - Monitoramento dos Agents cadastrados


É possível aqui verificar se o Agent está em execução ou não através da coluna Status.

A partir da LIB 20180615, as Threads dos Agents não são mais exibidas na tela do Monitor, devido a uma alteração no mecanismo de controle das mesmas. A atribuição de Threads aos Agents passa a ser automática.


Agendamento de rotinas no Schedule Protheus

Cadastrar as rotinas no Schedule Protheus é muito simples. Acesse Ambiente/Schedule/Schedule (CFGA010). Clicando em Agendamentos é possível verificar quais rotinas estão agendadas para execução.



Figura 5- Visualização de rotinas agendadas para execução.


Para realizar o agendamento de uma nova rotina, basta ir em Cadastro e incluir a rotina na qual se deseja realizar o agendamento.


Figura 6 - Interface para manipulação das rotinas a serem agendadas.


Na parte inferior, em detalhes é possível incluir uma nova rotina, clicando em Incluir. É necessário incluir dados nos seguintes campos:
Código – O código do agendamento é incluído automaticamente;
Usuário – É necessário vincular o usuário associado à execução da rotina;
Rotina – Rotina que terá a sua execução agendada. Existe um facilitador para encontrar a rotina desejada (uma consulta padrão, ou F3). Para que a rotina seja localizada pela consulta é necessário que:

  • Esta rotina esteja em um dos menus do sistema;
  • O usuário associado possua permissão para executar a rotina a ser agendada;
  • A rotina a ser agendada possua a função static Scheddef (veja detalhes sobre a criação da Scheddef no TDN).
  • A rotina informada passará por uma validação estática da expressão, sendo assim, não é qualquer expressão ADVPL que será permitida, podendo ser necessário encapsular a rotina;

O botão Parâmetros trará os parâmetros da rotina, caso a mesma possua Scheddef definida. Para rotinas que possuem Scheddef definida não é possível realizar passagem de parâmetros diretamente na rotina.
Supondo que a rotina TesteSched possua Scheddef definida. Neste caso, ela deve ser cadastrada no campo Rotina como 'TESTESCHED'. Caso a rotina não possua Scheddef definida, é possível realizar a passagem de parâmetros pela própria rotina, e neste caso a rotina pode ser cadastrada como 'TESTESCHED (parametro1, parametro2, parametroN)'. Mais detalhes da diferença entre rotinas com Scheddef e rotinas sem Scheddef (rotinas de processo especial) são mostradas no tópico Preparando uma rotina para ser agendada no Schedule Protheus.

Obs.: As alterações de Parâmetros em um agendamento só são validas para as próximas tarefas que esse agendamento irá gerar, pois os parâmetros são criados com as tarefas pouco antes do momento em que a mesma deverá ser executada de acordo com o horário/recorrência definida no agendamento.

Importante!!!

Caso o agendamento tenha a sua Recorrência configurada como Sempre Ativo, devido ter uma única tarefa criada no momento da inclusão do agendamento, nenhuma alteração de parâmetros será lida por este agendamento. Neste caso é necessário recriar o agendamento para utilizar os novos parâmetros.


Data – Defina a data de início para o agendamento da rotina;
Hora – Defina a hora de início do agendamento da rotina;
Ambiente – Defina em qual ambiente esta rotina será executada;
Empresa/Filial – Defina para qual par empresa/Filial a rotina será executada.

Importante - Melhoria disponibilizada no label 13102015

A partir deste label, para as rotinas em que a filial do agendamento pode ser selecionada e mais de uma filial possa ser selecionada (os agendamentos do EAI Protheus e TOTVS PDV não se enquadram neste requisito) é possível realizar o agendamento para todas as filiais do grupo em um único processo.

Veja o exemplo da rotina a seguir, cadastrando a ROTNAX, ao clicarmos em Empresa/Filial um wizard é apresentado:

Ao clicarmos em avançar, a tela de grupo de empresas é apresentada:

Podemos aqui selecionar um ou todos os grupos de empresas.

Selecionando o grupo 18 e clicando em avançar, a tela de filiais é apresentada:

Podemos selecionar as filiais que desejamos realizar o agendamento da rotina, ou podemos também não selecionar nenhuma filial, ou ainda todas.

Ao selecionar alguma filial: Será gerado um agendamento para aquele grupo/filial

Se não selecionarmos nenhuma filial: Será gerado um agendamento para o grupo de empresas

Ao selecionarmos todas as filiais: Serão gerados agendamentos para todas as filiais do sistema separadamente.

Como cada agendamento é formado pela rotina agendada mais o par grupo/filial, caso não seja escolhida nenhuma filial para o agendamento a rotina será executada em todas as filiais do sistema em um único processo (uma única thread de agent). Isto significa que o processo seguirá em fila, sendo que o processo será executado em uma filial por vez, independente da quantidade de threads disponíveis. Caso seja selecionado alguma filial, os processos poderão ocorrer em paralelo, visto que cada agendamento (rotina+ grupo +filial) será executado em uma thread de agent diferente.




Módulo – Defina o módulo associado a rotina agendada.
Criada desta forma, a rotina será executada apenas na data e hora informada. Caso seja necessário que o processo se repita é possível cadastrar também uma Recorrência.
Clique em e a tela de cadastro de recorrência é aberta.


Figura 7 - Cadastro de recorrência para a rotina agendada.

É possível definir a regra de execução da rotina. É possível definir o padrão de recorrência (diário, semanal, mensal anual e sempre ativo, o número de execuções e a data de término deste agendamento).
Não é possível selecionar o número de execuções e a data de término quando o padrão de Recorrência é cadastrado como sempre ativo. Neste tipo de padrão, a rotina é executada em loop, ou seja, ao final de sua execução ela é iniciada novamente, isto enquanto houver Threads de Agents disponíveis.
Confirmando a inclusão e tendo os serviços de Manager e Agents ativos, a rotina já está pronta para ser executada pelo Schedule Protheus.ClicandoProtheus. Clicando em Monitor é possível verificar as execuções agendadas, bem como as tarefas geradas para a rotina cadastrada. Já os eventos associados a execução só estarão disponíveis para as rotinas preparadas para agendamento, ou seja, para aquelas que tiverem SchedDef definida.
É importante esclarecer a relação entre um agendamento e as tarefas geradas. Um agendamento gera uma tarefa para cada grupo de empresa/filial cadastrado para este agendamento.


Figura 8 - Rotinas agendadas e seus eventos associados.


Observação: É possível desabilitar um agendamento criado, clicando no agendamento e desmarcando a opção Habilitada. Contudo, informamos que esta ação apenas desabilita o agendamento, as tarefas criadas por esse agendamento continuam na fila até o término de todas suas execuções pendentes. Se o agendamento tiver a opção de recorrência Sempre Ativo, mesmo desabilitando o agendamento, as tarefas vão continuar na fila de execução a menos que o Administrador execute a rotina de Limpeza de Tabelas do Schedule, e remova as tarefas pendentes.

Caso queira excluir o agendamento e todas suas tarefas pendentes, clique no agendamento e então no botão Excluir.

Monitor da Fila do EAI

Na interface do Schedule Protheus é possível verificar as mensagens trafegadas no EAI Protheus. No Schedule, selecionando EAI a fila de transações é apresentada.

Figura 9 - Fila de transações do EAI Protheus


Aqui é possível verificar o status das mensagens recebidas e enviadas pelo EAI Protheus, bem como realizar o gerenciamento das mensagens. Na barra superior, existem quatro botões com as seguintes funções:


O Primeiro botão permite que as mensagens com Falha de Processamento ou Bloqueadas voltem para o status de Aguardando Processamento. Somente mensagens do tipo Assíncronas permitem o reprocessamento. Mensagens síncronas entram em estado de Falha e não são mais reprocessadas. As mensagens Assíncronas sofrem quatro tentativas de reprocessamento automaticamente e após isto, somente são reprocessadas com a intervenção da funcionalidade do primeiro botão.
O segundo botão bloqueia uma mensagem, e seu processamento não será realizado, a menos que a funcionalidade de Reprocessar seja invocada.
O terceiro botão (lupa) permite que sejam visualizadas as mensagens originais (mensagem original é a mensagem que originou o processo) ou as mensagens de resposta (o retorno das mensagens originais). O último botão atualiza a interface das mensagens.
Na parte inferior é possível verificar o Status de Processamento das mensagens. Lembrando que e o EAI Protheus, tal qual o Schedule Protheus não faz o processamento da mensagem. A mensagem é processada por uma rotina específica, normalmente conhecida como Adapter EAI. As informações mostradas na parte inferior refletem o processamento desta rotina. Na lupa da parte inferior é possível conferir mais detalhes do processamento.


Figura 10 - Detalhes das tarefas do EAI Protheus

Limpeza de tabelas do Schedule Protheus

É possível através da interface do Schedule Protheus apagar registros das tarefas, da fila de mensagens do EAI Protheus ou ainda dos eventos associados. Para isto, posicione em Limpeza de tabelas.

Figura 11 - Limpeza de tabelas do Schedule Protheus


É possível selecionar qual o tipo de tabela que se deseja apagar os registros e ainda selecionar um filtro para este procedimento:

Figura 12 - Escolhida a tabela EAI, é possível realizar o procedimento junto com um filtro.


No exemplo acima, selecionamos a tabela EAI e vamos agora apagar somente os registros que estão bloqueados. Note que é possível incluir novos filtros para o procedimento.


Figura 13 - Selecionado o filtro 'bloqueado', para que sejam trazidos somente os registros da fila do EAI que estão bloqueados.


Somente os registros bloqueados serão trazidos. Clicando no botão excluir, no canto superior direito, os registros são excluídos.

Preparando uma rotina para ser agendada no Schedule Protheus


Considerações sobre rotinas agendadas

Criar uma rotina para ser agendada no Schedule Protheus é algo simples, porém, alguns cuidados devem ser observados. Existem algumas regras e definições que devem ser observadas no processo. Consumo de memória, travamento do serviço e desempenho são preocupações a serem tomadas pela rotina que foi agendada, e nunca pelo Schedule Protheus.
Outro cuidado que deve ser tomado ao preparar uma rotina para ser executada via Schedule, ou em qualquer job, é com relação a componentes de interface. Uma rotina que será executada apenas no server não pode ter interação com componentes que precisam de cliente para serem criados. O uso indevido desses componentes irá gerar um erro de comunicação e consecutivamente irá interromper o processamento.
Vale ressaltar que, o Schedule Protheus apenas aciona a rotina agendada e os problemas mencionados acima não estão relacionados a ele.

Agendamentos atrasados

O Schedule Protheus mantém um controle interno dos agendamentos que não foram realizados. Devido a esta característica, caso existam agendamentos que não foram executados no momento correto ele irá iniciar em sequência todos os agendamentos que já deveriam ter sido iniciados até que o processo seja normalizado. Vejamos o exemplo a seguir:


Figura 14- Exemplo de agendamento de rotina no Schedule Protheus


No exemplo acima, agendamos a rotina TesteSch e vamos então definir uma recorrência para este agendamento:

Figura 15 - Exemplo de agendamento com recorrência no Schedule Protheus


Como mostra na figura 15, o processo deverá ser realizado diariamente, todos os dias da semana, sem data de término, com 36 execuções diárias, com intervalo de 30 minutos entre as execuções, com início em 27/10/14 as 00:00h. Clicamos no botão execuções e verificamos as execuções que serão agendadas. Perceba que, se estivermos cadastrando este processo as 10:00h, ao salvarmos o agendamento estaremos com 21 agendamentos atrasados (um a cada meia hora, desde as 00:00). O Schedule Protheus então irá iniciar estes processos sequencialmente, até que todos os agendamentos atrasados sejam normalizados, voltando assim a respeitar os intervalos configurados. Esta característica também se aplica aos casos em que o servidor foi parado por qualquer motivo e o processo não pode ser inicializado no momento correto.

Criando uma rotina de Processo Especial no Schedule Protheus

Uma rotina de Processo Especial é uma rotina que não possuí a rotina estática Scheddef definida. Nestes casos a rotina agendada passa os seus parâmetros diretamente. Uma thread separada é inicializada para o processamento e neste cenário a montagem do ambiente não é realizada, devendo ser tratada internamente na rotina que foi agendada. 

o Schedule faz o controle da fila de tarefas agendadas, de maneira que uma mesma tarefa não possa ser executada de maneira simultânea. Considera-se como tarefa um agendamento de uma rotina para um par empresa e filial.


Atenção! Libs anteriores ao label 04032016

Rotinas que não possuem Scheddef, em labels anteriores a 04032016, não possuem controle de fila pelo Schedule. Isto quer dizer que, se houver dois agendamentos da mesma rotina para o mesmo horário ou ainda se, devido a uma parada no sistema ou uma configuração que permita que existam agendamentos atrasados ou ainda se a rotina estiver com a recorrência cadastrada como sempre ativo e houver threads de agent livres, a rotina pode ser executada mais de uma vez ao mesmo tempo. 


No exemplo abaixo, vamos cadastrar uma rotina que não possuí SchedDef definida:


Figura 16 - Cadastramento de uma rotina de processo especial


No exemplo acima, cadastramos a rotina TesteSch, enviando para a rotina três parâmetros: TesteSch('001',2,'003') - Uma string 001, um numérico 2 e uma segunda string 003. Como se trata de um processo especial, o ambiente não será montado pelo Schedule Protheus, porém serão enviadas informações para a rotina para que isto seja realizado, caso necessário. Desta forma, é enviado um array para o processo especial, com as seguintes características:
aArray[1] – Primeiro parâmetro passado na rotina ('001');
aArray[2] – Segundo parâmetro passado na rotina (2);
aArray[3] – Terceiro parâmetro passado na rotina ('003');
aArray[4] – Empresa associada ao agendamento da rotina;
aArray[5] – Filial associada ao agendamento da rotina;
aArray[6] – Usuário associado ao agendamento;
aArray[7] – Id do agendamento.
Desta maneira, são sempre enviados primeiramente os parâmetros passados na rotina para logo em seguida serem enviadas as informações de empresa, filial, usuário e Id da tarefa.
Vejamos um exemplo de código de processo especial:




Figura 17 - Exemplo de rotina de processo especial


No exemplo acima, a rotina irá receber os parâmetros necessários e irá executar a abertura do ambiente.
Vamos observar, no console do Appserver Protheus o resultado deste processamento, lembrando que todos os serviços do Schedule Protheus devem estar ativos para que o agendamento seja executado:

Criando uma rotina com Scheddef no Schedule Protheus sem receber parâmetros

Podemos criar uma rotina agendada no Schedule Protheus declarando na rotina a função Static Scheddef. Para mais informações sobre a Scheddef consulte a página no TDN.
Abaixo, o exemplo de cadastramento de uma rotina que possui Scheddef definida, mas não possui nenhum Pergunte (SX1) para a rotina:



Figura 18 - Exemplo de rotina com Scheddef e sem Pergunte

No exemplo acima, nossa rotina será chamada pelo Schedule Protheus com o ambiente já aberto, porém, não receberá nenhum parâmetro. A rotina agendada é executada na mesma thread do Schedule, e desta maneira, a rotina agendada deve devolver o ambiente integro ao final do processamento (não é possível, por exemplo, realizar a troca/abertura ou fechamento do ambiente, por exemplo). Esta rotina também será processada como um Processo (P)
Vamos realizar o agendamento desta rotina e clicar no botão parâmetros:


Figura 19 - Exemplo de agendamento de rotina com Scheddef sem parâmetros


No caso acima a rotina não possui parâmetros para serem visualizados. Vamos então agendar esta rotina para ser executada na empresa 19, filial D RJ 01 e verificar o retorno no console.log.




Não foi necessária a abertura do ambiente e nestes casos, caso existam dois processos agendados da mesma rotina para o mesmo momento, o processo é serializado, para que o segundo processo só tenha início ao término do primeiro.

Criando uma rotina com Scheddef no Schedule Protheus recebendo parâmetros do SX1

Vamos agora criar uma nova rotina com Scheddef, passando um pergunte (SX1) para a rotina.


Figura 20 - Função com Scheddef definida com um grupo de perguntas


Vamos agora agendar esta rotina, e clicar no botão parâmetros:


Figura 21 - Configuração de Schedule com grupo de perguntas


Perceba que a ordem informada (Data Inicial e Data final) não foram passíveis de serem selecionadas, pois está definido no nosso Scheddef que o tipo de função era um Processo (P).
Vamos verificar o resultado no console.log

Criando uma rotina de relatório com Scheddef no Schedule Protheus recebendo parâmetros do SX1


Vamos agora realizar o mesmo exemplo anterior, mas agora a rotina a ser agendada será do tipo Relatório (R). Neste caso, a ordem poderá ser configurada.



Figura 22 - Exemplo de rotina de relatório com grupo de perguntas




Figura 23 - Exemplo de um agendamento e rotina de relatório. Neste exemplo a aba 'Dispositivo' está visível e a ordem pode ser configurada


No console.log, podemos ver o resultado da rotina.


Abertura de threads no Schedule Protheus

O Schedule Protheus abre uma quantidade de threads que são proporcionais ao número de serviços necessários para a sua execução, e estes números são apresentados a seguir:

  • Task Manager - 1 thread quando este serviço está ativo;
  • Queue Manager - 1 thread quando este serviço está ativo;
  • Cada agent configurado
    • 1 thread de controle
    • 1 thread de conexão (este se conecta ao server via RPC)
    • 1 thread até o limite de threads informadas para execução (o número de threads definidas na configuração do agent)
    • Threads de execução
      • Caso a rotina seja uma rotina de processo especial (vide acima) 1 thread a mais é aberta para o processamento. Esta thread é finalizada no término desta tarefa.

Importante

Cada thread aberta no sistema, que faça uso de qualquer arquivo local (seja um dicionário ou qualquer outro arquivo) consome sempre uma licença do cTree Server (caso configurado). 


Funções utilizáveis no Schedule Protheus

FWGetRunSchedule

Função que retorna se a execução está dentro do novo Schedule Protheus

FWGetRunSchedule(  )

Sem parâmetro de entrada.

Retorno - lRet - Indica se está ou não em execução pelo Schedule Protheus.

  • Sem rótulos