Já vimos que o código do espaço de trabalho deve estar consciente da coincidência mesmo que não esteja utilizando a estrutura de coincidência. O armazenamento em batch do espaço de trabalho e a utilização de regras de planejamento ajudam no compartilhamento do espaço de trabalho com outros plug-ins (e seus encadeamentos) que estão modificando o espaço de trabalho. Assim que o seu plug-in estiver utilizando o armazenamento em batch e as regras (consulteArmazenando as alterações de recursos em batch), é fácil executar o mesmo trabalho utilizando os mecanismos de coincidência da plataforma.
Uma Tarefa é uma unidade básica do trabalho assíncrono em execução coincidente com outras tarefas. O plug-in de recursos define WorkspaceJob como um mecanismo conveniente para definir as modificações de recurso assíncrono. O código que normalmente seria armazenado em batch em umIWorkspaceRunnable é colocado no método runInWorkspace de um subtipo da tarefa do espaço de trabalho. Em vez de executar o código utilizando o protocolo IWorkspace, a tarefa é planejada como qualquer outra tarefa. As regras de planejamento apropriadas devem ser incluídas na tarefa antes de ser planejada.
Vamos observar um exemplo de espaço de trabalho executável e o que deveria ser feito para torná-lo uma tarefa:
IWorkspaceRunnable myRunnable = new IWorkspaceRunnable() { public void run(IProgressMonitor monitor) throws CoreException { //do the actual work in here doSomeWork(); ... } }
O trabalho é movido para o método apropriado do nosso subtipo de WorkspaceJob.
class MyWorkspaceJob extends WorkspaceJob { public MyWorkspaceJob() { super("My Workspace Job"); } public IStatus runInWorkspace(IProgressMonitor monitor) { //do the actual work in here doSomeWork(); return Status.OK_STATUS; } }
Nosso executável tinha que ser chamado especificamente:
IWorkspace workspace = ResourcesPlugin.getWorkspace(); workspace.run(myRunnable, myProject, IWorkspace.AVOID_UPDATE, null);
Nossa tarefa é planejada como qualquer outra. O gerenciador de tarefa da plataforma a executará de acordo com sua prioridade, outras tarefas na fila e as regras de planejamento. Observe que devemos anexar a regra de planejamento à tarefa para evitar modificação simultânea do myProject.
MyWorkspaceJob job = new MyWorkspaceJob(); job.setRule(myProject); job.schedule();
Agora que a operação foi estruturada como uma tarefa, todos os mecanismos de planejamento (prioridade, atraso, replanejamento) podem ser utilizados. Os eventos de alteração de recurso serão armazenados em batch até que a tarefa conclua a execução.