]> source.dussan.org Git - archiva.git/commitdiff
[MRM-691] ensure proper scheduling after configuration changes
authorBrett Porter <brett@apache.org>
Mon, 25 Feb 2008 13:26:35 +0000 (13:26 +0000)
committerBrett Porter <brett@apache.org>
Mon, 25 Feb 2008 13:26:35 +0000 (13:26 +0000)
Merged from: r630838

git-svn-id: https://svn.apache.org/repos/asf/maven/archiva/branches@630841 13f79535-47bb-0310-9956-ffa450edef68

archiva-1.0.x/archiva-scheduled/src/main/java/org/apache/maven/archiva/scheduled/DefaultArchivaTaskScheduler.java

index f202935157e91848b8ecffdb46f007cae64e3796..7da275bee8d9a4713dd77fc7b966b8a084788622 100644 (file)
@@ -22,6 +22,8 @@ package org.apache.maven.archiva.scheduled;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.maven.archiva.common.ArchivaException;
 import org.apache.maven.archiva.configuration.ArchivaConfiguration;
+import org.apache.maven.archiva.configuration.ConfigurationEvent;
+import org.apache.maven.archiva.configuration.ConfigurationListener;
 import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration;
 import org.apache.maven.archiva.scheduled.tasks.ArchivaTask;
 import org.apache.maven.archiva.scheduled.tasks.DatabaseTask;
@@ -31,8 +33,6 @@ import org.codehaus.plexus.logging.AbstractLogEnabled;
 import org.codehaus.plexus.personality.plexus.lifecycle.phase.Startable;
 import org.codehaus.plexus.personality.plexus.lifecycle.phase.StartingException;
 import org.codehaus.plexus.personality.plexus.lifecycle.phase.StoppingException;
-import org.codehaus.plexus.registry.Registry;
-import org.codehaus.plexus.registry.RegistryListener;
 import org.codehaus.plexus.scheduler.CronExpressionValidator;
 import org.codehaus.plexus.scheduler.Scheduler;
 import org.codehaus.plexus.taskqueue.Task;
@@ -45,7 +45,9 @@ import org.quartz.JobDetail;
 import org.quartz.SchedulerException;
 
 import java.text.ParseException;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 /**
  * Default implementation of a scheduling component for archiva.
@@ -56,7 +58,7 @@ import java.util.List;
  */
 public class DefaultArchivaTaskScheduler
     extends AbstractLogEnabled
-    implements ArchivaTaskScheduler, Startable, RegistryListener
+    implements ArchivaTaskScheduler, Startable, ConfigurationListener
 {
     /**
      * @plexus.requirement
@@ -92,9 +94,13 @@ public class DefaultArchivaTaskScheduler
 
     public static final String CRON_HOURLY = "0 0 * * * ?";
 
+    private Set<String> jobs = new HashSet<String>();
+
     public void startup()
         throws ArchivaException
     {
+        archivaConfiguration.addListener( this );
+
         try
         {
             start();
@@ -129,7 +135,7 @@ public class DefaultArchivaTaskScheduler
         }
     }
 
-    private void scheduleRepositoryJobs( ManagedRepositoryConfiguration repoConfig )
+    private synchronized void scheduleRepositoryJobs( ManagedRepositoryConfiguration repoConfig )
         throws SchedulerException
     {
         if ( repoConfig.getRefreshCronExpression() == null )
@@ -164,6 +170,7 @@ public class DefaultArchivaTaskScheduler
             CronTrigger trigger =
                 new CronTrigger( REPOSITORY_JOB_TRIGGER + ":" + repoConfig.getId(), REPOSITORY_SCAN_GROUP, cronString );
 
+            jobs.add( REPOSITORY_JOB + ":" + repoConfig.getId() );
             scheduler.scheduleJob( repositoryJob, trigger );
         }
         catch ( ParseException e )
@@ -175,7 +182,7 @@ public class DefaultArchivaTaskScheduler
 
     }
 
-    private void scheduleDatabaseJobs()
+    private synchronized void scheduleDatabaseJobs()
         throws SchedulerException
     {
         String cronString = archivaConfiguration.getConfiguration().getDatabaseScanning().getCronExpression();
@@ -215,64 +222,16 @@ public class DefaultArchivaTaskScheduler
         try
         {
             scheduler.unscheduleJob( DATABASE_JOB, DATABASE_SCAN_GROUP );
-        }
-        catch ( SchedulerException e )
-        {
-            throw new StoppingException( "Unable to unschedule tasks", e );
-        }
-    }
-
-    public void beforeConfigurationChange( Registry registry, String propertyName, Object propertyValue )
-    {
-        // nothing to do
-    }
-
-    /**
-     *
-     */
-    public void afterConfigurationChange( Registry registry, String propertyName, Object propertyValue )
-    {
-        // cronExpression comes from the database scanning section
-        if ( "cronExpression".equals( propertyName ) )
-        {
-            getLogger().debug( "Restarting the database scheduled task after property change: " + propertyName );
-
-            try
-            {
-                scheduler.unscheduleJob( DATABASE_JOB, DATABASE_SCAN_GROUP );
 
-                scheduleDatabaseJobs();
-            }
-            catch ( SchedulerException e )
+            for ( String job : jobs )
             {
-                getLogger().error( "Error restarting the database scanning job after property change." );
+                scheduler.unscheduleJob( job, REPOSITORY_SCAN_GROUP );
             }
+            jobs.clear();
         }
-
-        // refreshCronExpression comes from the repositories section
-        // 
-        // currently we have to reschedule all repo jobs because we don't know where the changed one came from
-        if ( "refreshCronExpression".equals( propertyName ) )
+        catch ( SchedulerException e )
         {
-            List<ManagedRepositoryConfiguration> repositories = archivaConfiguration.getConfiguration()
-            .getManagedRepositories();
-
-            for ( ManagedRepositoryConfiguration repoConfig : repositories )
-            {
-                if ( repoConfig.getRefreshCronExpression() != null )
-                {
-                    try
-                    {
-                        // unschedule handles jobs that might not exist
-                        scheduler.unscheduleJob( REPOSITORY_JOB + ":" + repoConfig.getId(), REPOSITORY_SCAN_GROUP );
-                        scheduleRepositoryJobs( repoConfig );
-                    }
-                    catch ( SchedulerException e )
-                    {
-                        getLogger().error( "error restarting job: " + REPOSITORY_JOB + ":" + repoConfig.getId() );
-                    }
-                }
-            }
+            throw new StoppingException( "Unable to unschedule tasks", e );
         }
     }
 
@@ -352,4 +311,52 @@ public class DefaultArchivaTaskScheduler
     {
         databaseUpdateQueue.put( task );
     }
+
+    public void configurationEvent( ConfigurationEvent event )
+    {
+        if ( event.getType() == ConfigurationEvent.SAVED )
+        {
+            try
+            {
+                scheduler.unscheduleJob( DATABASE_JOB, DATABASE_SCAN_GROUP );
+
+                scheduleDatabaseJobs();
+            }
+            catch ( SchedulerException e )
+            {
+                log.error( "Error restarting the database scanning job after property change." );
+            }
+
+            for ( String job : jobs )
+            {
+                try
+                {
+                    scheduler.unscheduleJob( job, REPOSITORY_SCAN_GROUP );
+                }
+                catch ( SchedulerException e )
+                {
+                    log.error( "Error restarting the repository scanning job after property change." );
+                }
+            }
+            jobs.clear();
+
+            List<ManagedRepositoryConfiguration> repositories = archivaConfiguration.getConfiguration()
+            .getManagedRepositories();
+
+            for ( ManagedRepositoryConfiguration repoConfig : repositories )
+            {
+                if ( repoConfig.getRefreshCronExpression() != null )
+                {
+                    try
+                    {
+                        scheduleRepositoryJobs( repoConfig );
+                    }
+                    catch ( SchedulerException e )
+                    {
+                        log.error( "error restarting job: " + REPOSITORY_JOB + ":" + repoConfig.getId() );
+                    }
+                }
+            }
+        }
+    }
 }