JobMonitor

De BIS Wiki
Revisão de 22h20min de 13 de outubro de 2020 por Rodrigogml (discussão | contribs) (Funcionamento)
Ir para navegação Ir para pesquisar

O JobMonitor é o serviço do BISFW que permite que tarefas sejam executar em uma Thread paralela para que a thread principal não fique bloqueada esperando. Esse recurso é extremamente útil para tarefas demoradas, uma vez que permite retornar status sobre a execução da tarefa enquanto ela acontece, mesmo que seja pela interface WEB.

Funcionamento

Criando o Job em Segundo Plano

Para colocar uma tarefa em background basta implementar a classe Job e iniciar a execução dentro do método runJob().

Exemplo Tarefa em Execução em Background
Job job = new Job("Título da Tarefa") { //O título da tarefa é colocado no título da thread, o que ajuda no DEV.
  @Override
  public Object runJob(Job job, JobStatus jobStatus) throws Throwable {
    //Código para execução da tarefa...
  }

  @Override
  public void jobFinished(Job job, JobStatus jobStatus) {
    // Quando a tarefa é finalizada, o serviço JobMonitor chama este método para notificar
  }
};
job.start(); //inicia a tarefa

Quando a tarefa finalizar o JobMonitor chama o método jobFinished() para notificar o fim da execução da tarefa. Embora não faça muito sentido quando implementado como no modelo acima (em innerclasses) o método jobFinished() tem maior utilidade para implementações mais genéricas da interface.

Ambos os métodos recebem dois parâmetros:

  • job - referência da própria instância do Job criado.
  • jobStatus - Instância do objeto de status do job. Dentro desse objeto a tarefa deve atualizar as propriedades como "mensagens", percentual de tarefa realizada, etc..
JobStatus é passado por referência
Note que este objeto é passado como referência de memória, isto é, ele não precisa ser retornado o conteúdo interno dele é "atualizado" automaticamente para todos que tiverem a mesma referência. O objeto JobStatus é um objeto final dentro da classe Job.

Este objeto é tanto o que é passado para dentro dos métodos, quanto para o métodos que solicitam informação sobre o andamento do Job.

Deve-se tomar cuidado quando esse objeto for enviado para outras partes do sistema, como por exemplo atravessar uma fachada, ou qualquer outra situação em que o objeto é clonado e não mais usada a mesma instância da memória. Nestes casos alterações no novo objeto não refletirão no objeto original.


O JobMonitor

O JobMonitor é uma classe estática que controla e mantém todos os Jobs do Sistema. Ao criar uma instância de Job ele automaticamente se registra no JobMonitor. Mesmo antes de iniciar a tarefa o JobMonitor já tem a referência da classe e monitora seu status.

Quando o Job é criado, ela cria também sua classe JobStatus, e dentro dela é possível encontrar seu identificador único (UUID). Com este UUID é possível solicitar informações do Job no JobMonitor. Assim, caso o JobMonitor esteja sendo executado em uma VM e o objeto que queira saber o status esteja em outra, ele pode solicitar o objeto JobStatus utilizando dessa UUID. Exemplo:

Exemplo Tarefa em Execução em Background
//Implementação do Job
Job job = new Job("Título da Tarefa") { ... }; 

//Recuepra o objeto que mantém o status de progresso diretamente da tarefa
JobStatus status = job.getStatus();

//Obtemos e salvamos para referência futura o UUID do Job
String uuid = status.getUuid();

//Obtendo o JobStatus a partir do JobMonitor com o UUID do job.
JobStatus status2 = JobMonitor.getJobStatus(uuid);

Note que no exemplo acima o start() do job pode ser dado a qualquer momento. O job não precisa estar sendo executado para que todo o restante funcione. Porém normalmete o job já é inicializado assim que que a instância é criada.

Retorno do UUID
Normalmente os métodos que executam um trabalho pesado já são implementados dentro do JobMonitor e o real retorno do método só ocorre quando o job termina.

Por isso o método chamado para iniciar o job em geral retorna o UUID da tarefa. O retorno real do método quando existir é retornado dentro do objeto JobStatus, bem como a exceção caso exista (melhor explicado a seguir).