blob: 975e2d43c358731c5f8fd4a3e1ba836ff2b13ddc [file] [log] [blame]
/*
* 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.karaf.scheduler;
import java.util.Date;
import java.util.Map;
/**
* A scheduler to schedule time/cron based jobs.
* A job is an object that is executed/fired by the scheduler. The object
* should either implement the {@link Job} interface or the {@link Runnable}
* interface.
*
* A job can be scheduled either by creating a {@link ScheduleOptions} instance
* through one of the scheduler methods and then calling {@link #schedule(Object, ScheduleOptions)}
* or
* by using the whiteboard pattern and registering a Runnable service with either
* the {@link #PROPERTY_SCHEDULER_EXPRESSION} or {@link #PROPERTY_SCHEDULER_PERIOD}
* property. Services registered by the whiteboard pattern can by default run concurrently,
* which usually is not wanted. Therefore it is advisable to also set the
* {@link #PROPERTY_SCHEDULER_CONCURRENT} property with Boolean.FALSE.
*/
public interface Scheduler {
/**
* Name of the configuration property to define the period for a job.
* The period is expressed in seconds.
* This property needs to be of type Long.
*/
String PROPERTY_SCHEDULER_PERIOD = "scheduler.period";
/**
* Name of the configuration property to define if a periodically job should be scheduled immediate.
* Default is to not startup immediate, the job is started the first time after the period has expired.
* This property needs to be of type Boolean.
*/
String PROPERTY_SCHEDULER_IMMEDIATE = "scheduler.immediate";
/** Name of the configuration property to define the cron expression for a job. */
String PROPERTY_SCHEDULER_EXPRESSION = "scheduler.expression";
/** Name of the configuration property to define if the job can be run concurrently. */
String PROPERTY_SCHEDULER_CONCURRENT = "scheduler.concurrent";
/** Name of the configuration property to define the job name. */
String PROPERTY_SCHEDULER_NAME = "scheduler.name";
/**
* Schedule a job based on the options.
*
* Note that if a job with the same name has already been added, the old job is cancelled and this new job replaces
* the old job.
*
* The job object needs either to be a {@link Job} or a {@link Runnable}. The options have to be created
* by one of the provided methods from this scheduler.
*
* @param job The job to execute (either {@link Job} or {@link Runnable}).
* @param options Required options defining how to schedule the job.
* @throws SchedulerError if the job can't be scheduled.
* @throws IllegalArgumentException If the preconditions are not met.
* @see #NOW()
* @see #NOW(int, long)
* @see #AT(Date)
* @see #AT(Date, int, long)
* @see #EXPR(String)
*/
void schedule(Object job, ScheduleOptions options) throws IllegalArgumentException, SchedulerError;
/**
* Remove a scheduled job by name.
*
* @param jobName The name of the job.
* @return <code>True</code> if the job existed and could be stopped, <code>false</code> otherwise.
*/
boolean unschedule(String jobName);
Map<Object, ScheduleOptions> getJobs() throws SchedulerError;
/**
* Triggers a scheduled job.
*
* @param jobName The name of the job.
* @return <code>true</code> if the job was triggered, otherwise <code>false</code>
* @throws SchedulerError if the job can't be triggered.
*/
boolean trigger(String jobName) throws SchedulerError;
/**
* Create a schedule options to fire a job immediately and only once.
*
* @return The corresponding {@link ScheduleOptions}.
*/
ScheduleOptions NOW();
/**
* Create a schedule options to fire a job immediately more than once.
* @param times The number of times this job should be started (must be higher than 1 or -1 for endless).
* @param period Every period seconds this job is started (must be at higher than 0).
* @return The corresponding {@link ScheduleOptions}.
*/
ScheduleOptions NOW(int times, long period);
/**
* Create a schedule options to fire a job once at a specific date.
*
* @param date The date this job should be run.
* @return The corresponding {@link ScheduleOptions}.
*/
ScheduleOptions AT(final Date date);
/**
* Create a schedule options to fire a job period starting at a specific date.
*
* @param date The date this job should be run.
* @param times The number of times this job should be started (must be higher than 1 or -1 for endless).
* @param period Every period seconds this job is started (must be at higher than 0).
* @return The corresponding {@link ScheduleOptions}.
*/
ScheduleOptions AT(final Date date, int times, long period);
/**
* Create a schedule options to schedule the job based on the expression.
*
* @param expression The cron exception.
* @return The corresponding {@link ScheduleOptions}.
*/
ScheduleOptions EXPR(final String expression);
}