JobMonitor: mudanças entre as edições
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. | |||
@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 | |||
</syntaxhighlight>}} | </syntaxhighlight>}} | ||
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..
![]() |
|
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.
![]() |
|