aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrett Porter <brett@apache.org>2008-02-25 13:21:07 +0000
committerBrett Porter <brett@apache.org>2008-02-25 13:21:07 +0000
commita88253bafe407ce8ff6cc0a850f167fd35786711 (patch)
tree8203cd1cf1e00a8414c37990f7646f2d1b41557a
parent0c8a0d97ed68091fa5d0f2684aeca1dd5a15c287 (diff)
downloadarchiva-a88253bafe407ce8ff6cc0a850f167fd35786711.tar.gz
archiva-a88253bafe407ce8ff6cc0a850f167fd35786711.zip
[MRM-691] ensure proper scheduling after configuration changes
git-svn-id: https://svn.apache.org/repos/asf/maven/archiva/trunk@630838 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--archiva-scheduled/src/main/java/org/apache/maven/archiva/scheduled/DefaultArchivaTaskScheduler.java129
1 files changed, 68 insertions, 61 deletions
diff --git a/archiva-scheduled/src/main/java/org/apache/maven/archiva/scheduled/DefaultArchivaTaskScheduler.java b/archiva-scheduled/src/main/java/org/apache/maven/archiva/scheduled/DefaultArchivaTaskScheduler.java
index a74e204c4..fd3fd0901 100644
--- a/archiva-scheduled/src/main/java/org/apache/maven/archiva/scheduled/DefaultArchivaTaskScheduler.java
+++ b/archiva-scheduled/src/main/java/org/apache/maven/archiva/scheduled/DefaultArchivaTaskScheduler.java
@@ -19,12 +19,11 @@ package org.apache.maven.archiva.scheduled;
* under the License.
*/
-import java.text.ParseException;
-import java.util.List;
-
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;
@@ -33,8 +32,6 @@ import org.apache.maven.archiva.scheduled.tasks.RepositoryTaskSelectionPredicate
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;
@@ -48,6 +45,11 @@ import org.quartz.SchedulerException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+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 org.slf4j.LoggerFactory;
* @plexus.component role="org.apache.maven.archiva.scheduled.ArchivaTaskScheduler" role-hint="default"
*/
public class DefaultArchivaTaskScheduler
- implements ArchivaTaskScheduler, Startable, RegistryListener
+ implements ArchivaTaskScheduler, Startable, ConfigurationListener
{
private Logger log = LoggerFactory.getLogger( DefaultArchivaTaskScheduler.class );
@@ -94,9 +96,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();
@@ -131,7 +137,7 @@ public class DefaultArchivaTaskScheduler
}
}
- private void scheduleRepositoryJobs( ManagedRepositoryConfiguration repoConfig )
+ private synchronized void scheduleRepositoryJobs( ManagedRepositoryConfiguration repoConfig )
throws SchedulerException
{
if ( repoConfig.getRefreshCronExpression() == null )
@@ -166,6 +172,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 )
@@ -177,7 +184,7 @@ public class DefaultArchivaTaskScheduler
}
- private void scheduleDatabaseJobs()
+ private synchronized void scheduleDatabaseJobs()
throws SchedulerException
{
String cronString = archivaConfiguration.getConfiguration().getDatabaseScanning().getCronExpression();
@@ -217,64 +224,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 ) )
- {
- log.debug( "Restarting the database scheduled task after property change: " + propertyName );
-
- try
+ for ( String job : jobs )
{
- scheduler.unscheduleJob( DATABASE_JOB, DATABASE_SCAN_GROUP );
-
- scheduleDatabaseJobs();
- }
- catch ( SchedulerException e )
- {
- log.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 )
- {
- log.error( "error restarting job: " + REPOSITORY_JOB + ":" + repoConfig.getId() );
- }
- }
- }
+ throw new StoppingException( "Unable to unschedule tasks", e );
}
}
@@ -354,4 +313,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() );
+ }
+ }
+ }
+ }
+ }
}