U hebt al gezien dat de werkgebiedcode rekening moet houden met gemeenschappelijk gebruik als het gemeenschappelijke framework niet wordt gebruikt. Batchverwerking van wijzigingen en het gebruik van planningsregels komt goed van pas bij het delen van het werkgebied met andere plugins (en hun threads) die het werkgebied wijzigen. Als uw plugin batchverwerking en regels gebruikt (zie Resourcewijzigingen als batch verwerken), is het eenvoudig om hetzelfde werk te doen met de mechanismen voor gemeenschappelijk gebruik op het platform.
Een job is een basiseenheid van asynchroon werk die tegelijkertijd met andere jobs wordt uitgevoerd. De resourcesplugin definieert WorkspaceJob als nuttig mechanisme voor het definiëren van asynchrone resourcewijzigingen. Code die normaal als batch verwerkt zou worden in een IWorkspaceRunnable, wordt nu in de methode runInWorkspace van een subtype van een werkgebiedjob geplaatst. In plaats van het uitvoeren van de code met het IWorkspace-protocol, wordt de job net als andere jobs gepland. U moet de juiste planningsregels aan de job toevoegen voordat de job wordt gepland.
Hier volgt een voorbeeld van een werkgebiedrunnable en hoe u hiervan een job maakt:
IWorkspaceRunnable myRunnable = new IWorkspaceRunnable() { public void run(IProgressMonitor monitor) throws CoreException { //hier gebeurt het eigenlijke werk doSomeWork(); ... } }
Het werk wordt verplaatst naar de juiste methode van het subtype WorkspaceJob.
class MyWorkspaceJob extends WorkspaceJob { public MyWorkspaceJob() { super("My Workspace Job"); } public IStatus runInWorkspace(IProgressMonitor monitor) { //hier gebeurt het eigenlijke werk doSomeWork(); return Status.OK_STATUS; } }
De runnable moet specifiek worden opgeroepen:
IWorkspace workspace = ResourcesPlugin.getWorkspace(); workspace.run(myRunnable, myProject, IWorkspace.AVOID_UPDATE, null);
De job wordt net als andere jobs gepland. De platformtaakmanager start de job op basis van de prioriteit, andere jobs in de wachtrij en planningsregels. U moet de planningsregel aan de job koppelen om te voorkomen dat myProject tegelijkertijd verschillende wijzigingen ondergaat.
MyWorkspaceJob job = new MyWorkspaceJob(); job.setRule(myProject); job.schedule();
Nu de bewerking als job is gestructureerd, kunt u alle planningsmechanismen (prioriteit, uitstel, opnieuw plannen) gebruiken. Resourcewijzigingsevents worden als batch uitgevoerd tot de job niet meer wordt uitgevoerd.