Coincidência e o Espaço de Trabalho

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.

Tarefas do Espaço de Trabalho

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.