Os nossos exemplos até agora demonstraram a criação, agendamento e comunicação de progresso de trabalhos simples. O mecanismo de agendamento de trabalhos é muito mais potente do que mostrámos até aqui. Poderemos ter um controlo mais refinado sobre a agendamento do trabalho através de prioridades, diferimentos e condições de agendamento personalizadas.
A prioridade de um trabalho pode ser usada para estabelecer a importância de um trabalho em relação aos outros num sistema. Definir a prioridade não afecta um trabalho que já esteja em execução, mas sim como é que um trabalho em espera é agendado em relação a outros trabalhos. A prioridade de um trabalho pode ser uma de várias constantes de prioridade predeterminadas:
A prioridade predefinida para um trabalho é LONG. A porção de código seguinte cria o trabalho trivial que usámos anteriormente, mas define a prioridade como DECORATE para indicar que se trata da prioridade mais baixa:
TrabalhoTrivial job = new TrabalhoTrivial(); job.setPriority(Job.DECORATE); job.schedule();
Outra técnica para controlar a agendamento de um trabalho consiste em utilizar um diferimento de agendamento. Pode ser especificado um diferimento de agendamento quando o trabalho for agendado. O trabalho será diferido o número de milissegundos especificado antes de ser agendado.
TrabalhoTrivial job = new TrabalhoTrivial(); job.schedule(1000); // aguardar um segundo antes de agendadar
Não faz efeito agendadar um trabalho que já esteja em espera ou dormente. Todavia, ao agendadar um trabalho que já esteja em execução fará com que seja novamente agendado depois de ser concluído. Trata-se de um mecanismo conveniente para trabalhos repetitivos como, por exemplo, ciclos de sondagens em segundo plano. Se o trabalho for novamente agendado várias vezes durante a execução, só será novamente agendado uma vez com o diferimento mais recentemente facultado. A porção de código seguinte define um trabalho que se recalendarize a si mesmo para executar 10 segundos depois de terminar a actual iteração.
class RepetitiveTrivialJob extends Job { public RepetitiveTrivialJob() { super("Trabalho Trivial Repetitivo"); } public IStatus run(IProgressMonitor monitor) { System.out.println("Executar o trabalho."); // reagendar ao fim de 10 segundos schedule(10000); return Status.OK_STATUS; } }
O protocolo adicional na classe Job permite a um trabalho verificar pré-condições imediatamente antes de ser agendado para execução. Passamos a demonstrar com um exemplo:
class JobWithPreconditions extends Job { ... public boolean shouldSchedule() { return super.shouldSchedule() && checkJobPreconditions(); } public boolean shouldRun() { return super.shouldRun() && checkJobPreconditions(); } ... }
O método shouldSchedule é chamado logo antes de o gestor de trabalhos colocar o trabalho na fila. Isto permite ao trabalho cancelar-se a si próprio se não forem cumpridas as pré-condições de agendamento. O trabalho deve devolver false se não for apropriado agendadá-lo. Do mesmo modo, o método shouldRun é chamado logo antes de o gestor de trabalhos executar o trabalho. As condições adicionais que devem ser cumpridas antes de o trabalho ser executado devem ser verificadas nesta altura.