JobMonitor: mudanças entre as edições

De BIS Wiki
Ir para navegação Ir para pesquisar
Criou página com '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 é e...'
 
Linha 2: Linha 2:


= Funcionamento =
= 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()'''.
Para colocar uma tarefa em background basta implementar a classe Job e iniciar a execução dentro do método '''runJob()'''.


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


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


Basta
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..
{{nota|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:
 
{{java|Exemplo Tarefa em Execução em Background|<syntaxhighlight lang="java">
//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);
</syntaxhighlight>}}
 
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.
 
{{nota|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).
}}

Edição das 22h20min de 13 de outubro de 2020

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).