Author: cziegeler Date: Tue Aug 31 07:39:08 2010 New Revision: 991105 URL: http://svn.apache.org/viewvc?rev=991105&view=rev Log: SLING-1685 : Method to force remove a job
Modified: sling/trunk/bundles/extensions/event/pom.xml sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/JobStatusProvider.java sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/JobEventHandler.java sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/impl/AbstractRepositoryEventHandlerTest.java sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/impl/JobEventHandlerTest.java Modified: sling/trunk/bundles/extensions/event/pom.xml URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/pom.xml?rev=991105&r1=991104&r2=991105&view=diff ============================================================================== --- sling/trunk/bundles/extensions/event/pom.xml (original) +++ sling/trunk/bundles/extensions/event/pom.xml Tue Aug 31 07:39:08 2010 @@ -54,11 +54,6 @@ <extensions>true</extensions> <configuration> <instructions> - <!-- As we're using JCR 2.0 for testing we explicitly have to - import version 1.0 here --> - <Import-Package> - javax.jcr.*;version=1.0,* - </Import-Package> <Export-Package> org.apache.sling.event;version=2.4.0 </Export-Package> @@ -95,18 +90,16 @@ </reporting> <dependencies> <dependency> - <groupId>commons-io</groupId> - <artifactId>commons-io</artifactId> - <version>1.4</version> - <scope>test</scope> - </dependency> - <dependency> <groupId>org.apache.felix</groupId> <artifactId>org.apache.felix.scr.annotations</artifactId> - <version>1.2.0</version> + <version>1.3.0</version> <scope>provided</scope> </dependency> <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-api</artifactId> + </dependency> + <dependency> <groupId>org.osgi</groupId> <artifactId>org.osgi.core</artifactId> </dependency> @@ -158,16 +151,12 @@ <scope>provided</scope> </dependency> <dependency> - <groupId>org.slf4j</groupId> - <artifactId>slf4j-api</artifactId> - </dependency> - <dependency> <groupId>org.apache.jackrabbit</groupId> <artifactId>jackrabbit-jcr-commons</artifactId> <version>2.0.0</version> <scope>provided</scope> </dependency> - <!-- Testing --> + <!-- Testing --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> @@ -186,5 +175,11 @@ <version>2.0.0</version> <scope>test</scope> </dependency> + <dependency> + <groupId>commons-io</groupId> + <artifactId>commons-io</artifactId> + <version>1.4</version> + <scope>test</scope> + </dependency> </dependencies> </project> Modified: sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/JobStatusProvider.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/JobStatusProvider.java?rev=991105&r1=991104&r2=991105&view=diff ============================================================================== --- sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/JobStatusProvider.java (original) +++ sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/JobStatusProvider.java Tue Aug 31 07:39:08 2010 @@ -124,6 +124,28 @@ public interface JobStatusProvider { boolean removeJob(String topic, String jobId); /** + * Cancel this job. + * This method acts like {...@link #removeJob(String)} with the exception that it waits + * for a job to finish. The job will be removed when this method returns - however + * this method blocks until the job is finished! + * @param jobId The unique identifer as found in the property {...@link #PROPERTY_EVENT_ID}. + * @since 2.4.0 + */ + void forceRemoveJob(String jobId); + + /** + * Cancel this job. + * This method acts like {...@link #removeJob(String, String)} with the exception that it waits + * for a job to finish. The job will be removed when this method returns - however + * this method blocks until the job is finished! + * This method can be used if the topic and the provided job id is known. + * @param topic The job topic as put into the property {...@link EventUtil#PROPERTY_JOB_TOPIC}. + * @param jobId The unique identifer as put into the property {...@link EventUtil#PROPERTY_JOB_ID}. + * @since 2.4.0 + */ + void forceRemoveJob(String topic, String jobId); + + /** * Wake up the named job queue. * If a job failed, the job queue waits (sleeps) for a configured time. By calling this * method, the job queue can be woken up and force an immediate reprocessing. Modified: sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/JobEventHandler.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/JobEventHandler.java?rev=991105&r1=991104&r2=991105&view=diff ============================================================================== --- sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/JobEventHandler.java (original) +++ sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/JobEventHandler.java Tue Aug 31 07:39:08 2010 @@ -1652,6 +1652,7 @@ public class JobEventHandler /** * @see org.apache.sling.event.JobStatusProvider#cancelJob(java.lang.String, java.lang.String) */ + @Deprecated public void cancelJob(String topic, String jobId) { this.removeJob(topic, jobId); } @@ -1659,6 +1660,7 @@ public class JobEventHandler /** * @see org.apache.sling.event.JobStatusProvider#cancelJob(java.lang.String) */ + @Deprecated public void cancelJob(String jobId) { this.removeJob(jobId); } @@ -1719,9 +1721,37 @@ public class JobEventHandler /** + * @see org.apache.sling.event.JobStatusProvider#forceRemoveJob(java.lang.String, java.lang.String) + */ + public void forceRemoveJob(final String topic, final String jobId) { + while ( this.backgroundSession != null && !this.removeJob(topic, jobId) ) { + // instead of using complicated syncs, waits and notifies we simply poll + try { + Thread.sleep(50); + } catch (final InterruptedException ignore) { + this.ignoreException(ignore); + } + } + } + + /** + * @see org.apache.sling.event.JobStatusProvider#forceRemoveJob(java.lang.String) + */ + public void forceRemoveJob(final String jobId) { + while ( this.backgroundSession != null && !this.removeJob(jobId) ) { + // instead of using complicated syncs, waits and notifies we simply poll + try { + Thread.sleep(50); + } catch (final InterruptedException ignore) { + this.ignoreException(ignore); + } + } + } + + /** * @see org.apache.sling.event.JobStatusProvider#wakeUpJobQueue(java.lang.String) */ - public void wakeUpJobQueue(String jobQueueName) { + public void wakeUpJobQueue(final String jobQueueName) { if ( jobQueueName != null ) { synchronized ( this.jobQueues ) { final JobBlockingQueue queue = this.jobQueues.get(jobQueueName); Modified: sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/impl/AbstractRepositoryEventHandlerTest.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/impl/AbstractRepositoryEventHandlerTest.java?rev=991105&r1=991104&r2=991105&view=diff ============================================================================== --- sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/impl/AbstractRepositoryEventHandlerTest.java (original) +++ sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/impl/AbstractRepositoryEventHandlerTest.java Tue Aug 31 07:39:08 2010 @@ -70,6 +70,10 @@ public abstract class AbstractRepository session = repository.loginAdministrative(repository.getDefaultWorkspace()); assertTrue(RepositoryTestUtil.registerNodeType(session, DistributingEventHandler.class.getResourceAsStream("/SLING-INF/nodetypes/event.cnd"))); assertTrue(RepositoryTestUtil.registerNodeType(session, DistributingEventHandler.class.getResourceAsStream("/SLING-INF/nodetypes/folder.cnd"))); + if ( session.itemExists(REPO_PATH) ) { + session.getItem(REPO_PATH).remove(); + session.save(); + } } @org.junit.AfterClass public static void shutdownRepository() throws Exception { Modified: sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/impl/JobEventHandlerTest.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/impl/JobEventHandlerTest.java?rev=991105&r1=991104&r2=991105&view=diff ============================================================================== --- sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/impl/JobEventHandlerTest.java (original) +++ sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/impl/JobEventHandlerTest.java Tue Aug 31 07:39:08 2010 @@ -173,6 +173,13 @@ public class JobEventHandlerTest extends } }); jeh.handleEvent(getJobEvent(null, "myid", null)); + // sleep a little to give the job handler time write the job + try { + Thread.sleep(50); + } catch (InterruptedException e) { + // ignore + } + assertEquals(1, jeh.getAllJobs("sling/test").size()); cb.block(); // job is currently sleeping, therefore cancel fails @@ -188,6 +195,44 @@ public class JobEventHandlerTest extends } /** + * Test force cancelling a job + * The job execution always fails + */ + @org.junit.Test public void testForceCancelJob() throws Exception { + final JobEventHandler jeh = (JobEventHandler)this.handler; + final Barrier cb = new Barrier(2); + jeh.eventAdmin = new SimpleEventAdmin(new String[] {"sling/test"}, + new EventHandler[] { + new EventHandler() { + public void handleEvent(Event event) { + EventUtil.acknowledgeJob(event); + cb.block(); + try { + Thread.sleep(400); + } catch (InterruptedException e) { + // ignore + } + EventUtil.rescheduleJob(event); + } + + } + }); + jeh.handleEvent(getJobEvent(null, "myid", null)); + // sleep a little to give the job handler time write the job + try { + Thread.sleep(50); + } catch (InterruptedException e) { + // ignore + } + assertEquals(1, jeh.getAllJobs("sling/test").size()); + cb.block(); + // job is currently sleeping, but force cancel always waits! + jeh.forceRemoveJob("sling/test", "myid"); + // the job is now removed + assertEquals(0, jeh.getAllJobs("sling/test").size()); + } + + /** * Reschedule test. * The job is rescheduled two times before it fails. */