/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.sling.event.impl.jobs.config; import java.lang.annotation.Annotation; import java.util.Collections; import org.osgi.framework.Constants; import org.osgi.service.component.annotations.Activate; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Modified; import org.osgi.service.metatype.annotations.AttributeDefinition; import org.osgi.service.metatype.annotations.Designate; import org.osgi.service.metatype.annotations.ObjectClassDefinition; import org.osgi.service.metatype.annotations.Option; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * This is the configuration for the main queue. * */ @Component(name="org.apache.sling.event.impl.jobs.DefaultJobManager", service=MainQueueConfiguration.class, property={ Constants.SERVICE_VENDOR + "=The Apache Software Foundation" }) @Designate(ocd=MainQueueConfiguration.Config.class) public class MainQueueConfiguration { @ObjectClassDefinition(name = "Apache Sling Job Default Queue", description="The configuration of the default job queue.") public @interface Config { @AttributeDefinition( name="Priority", description="The priority for the threads used by this queue. Default is norm.", options = { @Option(label="NORM",value="Norm"), @Option(label="MIN",value="Min"), @Option(label="MAX",value="Max") }) String queue_priority() default ConfigurationConstants.DEFAULT_PRIORITY; @AttributeDefinition(name="Maximum Retries", description="The maximum number of times a failed job slated " + "for retries is actually retried. If a job has been retried this number of " + "times and still fails, it is not rescheduled and assumed to have failed. The " + "default value is 10.") int queue_retries() default ConfigurationConstants.DEFAULT_RETRIES; @AttributeDefinition(name="Retry Delay", description="The number of milliseconds to sleep between two " + "consecutive retries of a job which failed and was set to be retried. The " + "default value is 2 seconds. This value is only relevant if there is a single " + "failed job in the queue. If there are multiple failed jobs, each job is " + "retried in turn without an intervening delay.") long queue_retrydelay() default ConfigurationConstants.DEFAULT_RETRY_DELAY; @AttributeDefinition(name="Maximum Parallel Jobs", description="The maximum number of parallel jobs started for this queue. " + "A value of -1 is substituted with the number of available processors.") int queue_maxparallel() default ConfigurationConstants.DEFAULT_MAX_PARALLEL; } public static final String MAIN_QUEUE_NAME = "<main queue>"; /** Default logger. */ private final Logger logger = LoggerFactory.getLogger(this.getClass()); private InternalQueueConfiguration mainConfiguration; /** * Activate this component. * @param config Configuration properties */ @Activate protected void activate(final Config config) { this.update(config); } /** * Configure this component. * @param config Configuration properties */ @Modified protected void update(final Config config) { logger.debug("properties for queue {}: {}", MAIN_QUEUE_NAME, config); this.mainConfiguration = InternalQueueConfiguration.fromConfiguration( Collections.singletonMap(Constants.SERVICE_PID, (Object)"org.apache.sling.event.impl.jobs.DefaultJobManager"), new InternalQueueConfiguration.Config() { @Override public Class<? extends Annotation> annotationType() { return InternalQueueConfiguration.Config.class; } @Override public int service_ranking() { return 0; } @Override public String queue_type() { return InternalQueueConfiguration.Type.UNORDERED.name(); } @Override public String[] queue_topics() { return new String[] {"*"}; } @Override public int queue_threadPoolSize() { return 0; } @Override public long queue_retrydelay() { return config.queue_retrydelay(); } @Override public int queue_retries() { return config.queue_retries(); } @Override public String queue_priority() { return config.queue_priority(); } @Override public boolean queue_preferRunOnCreationInstance() { return false; } @Override public String queue_name() { return MAIN_QUEUE_NAME; } @Override public double queue_maxparallel() { return config.queue_maxparallel(); } @Override public boolean queue_keepJobs() { return false; } @Override public String webconsole_configurationFactory_nameHint() { return "Queue: {" + ConfigurationConstants.PROP_NAME + "}"; } }); } /** * Return the main queue configuration object. * @return The main queue configuration object. */ public InternalQueueConfiguration getMainConfiguration() { return this.mainConfiguration; } }