La simultaneidad y el área de trabajo

Ya hemos visto que el código del área de trabajo debe tener conocimiento de la simultaneidad aunque no utilice la infraestructura de simultaneidad. La agrupación por lotes de los cambios del área de trabajo y la utilización de normas de planificación ayuda a compartir el área de trabajo con otros conectores (y sus hebras) que están modificando el área de trabajo. Una vez que el conector está utilizando la agrupación por lotes y las normas (consulte la sección Agrupación por lotes de los cambios de recursos), es fácil realizar el mismo trabajo utilizando los mecanismos de simultaneidad de la plataforma.

Trabajos del área de trabajo

Un trabajo es una unidad básica de trabajo asíncrono que se ejecuta simultáneamente a otros trabajos. El conector de recursos define WorkspaceJob como mecanismo de conveniencia para definir modificaciones asíncronas de recursos. El código que generalmente se agruparía por lotes en un IWorkspaceRunnable se coloca en el método runInWorkspace de un subtipo de trabajo de área de trabajo. En lugar de ejecutar el código utilizando el protocolo IWorkspace, el trabajo se planifica igual que cualquier otro. Deben añadirse al trabajo las normas de planificación adecuadas antes de planificarlo.

Observemos un ejemplo de ejecutable de área de trabajo y lo que debe hacerse para convertirlo en un trabajo:

IWorkspaceRunnable myRunnable = 
        new IWorkspaceRunnable() {
 	        public void run(IProgressMonitor monitor) throws CoreException {
			//realizar aquí el trabajo real
			doSomeWork();
			...
		}
}

El trabajo se traslada al método adecuado del subtipo WorkspaceJob.

class MyWorkspaceJob extends WorkspaceJob {
	public MyWorkspaceJob() {
		super("Mi trabajo de área de trabajo");
	}
	public IStatus runInWorkspace(IProgressMonitor monitor) {
			//realizar aquí el trabajo real
		doSomeWork();
		return Status.OK_STATUS;
	}
}

El ejecutable debía invocarse específicamente:

    IWorkspace workspace = ResourcesPlugin.getWorkspace();
workspace.run(myRunnable, myProject, IWorkspace.AVOID_UPDATE, null);

Nuestro trabajo se planifica igual que cualquier otro. El gestor de trabajos de la plataforma lo ejecutará de acuerdo con su prioridad, con los demás trabajos de la cola y con las normas de planificación. Tenga en cuenta que debemos asociar la norma de planificación al trabajo para evitar la modificación simultánea de myProject.

MyWorkspaceJob job = new MyWorkspaceJob();
job.setRule(myProject);
job.schedule();

Ahora que la operación se ha estructurado como un trabajo, pueden utilizarse todos los mecanismos de planificación (prioridad, retardo, replanificación). Los eventos de cambio de recurso se agruparán por lotes hasta que el trabajo finalice.