/* 1 * 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.jobs; import java.util.Calendar; import java.util.Set; import org.osgi.annotation.versioning.ProviderType; /** * A job * * * Property Types * * In general all scalar types and all serializable classes are supported as * property types. However, in order for deseralizing classes these must be * exported. Serializable classes are not searchable in the query either. * Due to the above mentioned potential problems, it is advisable to not use * custom classes as job properties, but rather use out of the box supported * types in combination with collections. * * A resource provider might convert numbers to a different type, JCR is well-known * for this behavior as it only supports long but neither integer nor short. * Therefore if you are dealing with numbers, use the {@link #getProperty(String, Class)} * method to get the correct type instead of directly casting it. * * @since 1.2 */ @ProviderType public interface Job { /** * The name of the job queue processing this job. * This property is set by the job handling when the job is processed. * If this property is set by the client creating the job it's value is ignored */ String PROPERTY_JOB_QUEUE_NAME = "event.job.queuename"; /** * The property to track the retry count for jobs. Value is of type Integer. * On first execution the value of this property is zero. * This property is managed by the job handling. * If this property is set by the client creating the job it's value is ignored */ String PROPERTY_JOB_RETRY_COUNT = "event.job.retrycount"; /** * The property to track the retry maximum retry count for jobs. Value is of type Integer. * This property is managed by the job handling. * If this property is set by the client creating the job it's value is ignored */ String PROPERTY_JOB_RETRIES = "event.job.retries"; /** * This property is set by the job handling and contains a calendar object * specifying the date and time when this job has been created. * If this property is set by the client creating the job it's value is ignored */ String PROPERTY_JOB_CREATED = "slingevent:created"; /** * This property is set by the job handling and contains the Sling instance ID * of the instance where this job has been created. */ String PROPERTY_JOB_CREATED_INSTANCE = "slingevent:application"; /** * This property is set by the job handling and contains the Sling instance ID * of the instance where this job should be processed. */ String PROPERTY_JOB_TARGET_INSTANCE = "event.job.application"; /** * This property is set by the job handling and contains a calendar object * specifying the date and time when this job has been started. * This property is only set if the job is currently in processing * If this property is set by the client creating the job it's value is ignored */ String PROPERTY_JOB_STARTED_TIME = "event.job.started.time"; /** * The property to set a retry delay. Value is of type Long and specifies milliseconds. * This property can be used to override the retry delay from the queue configuration. * But it should only be used very rarely as the queue configuration should be the one * in charge. */ String PROPERTY_JOB_RETRY_DELAY = "event.job.retrydelay"; /** * This property contains the optional output log of a job consumer. * The value of this property is a string array. * This property is read-only and can't be specified when the job is created. * @since 1.3 */ String PROPERTY_JOB_PROGRESS_LOG = "slingevent:progressLog"; /** * This property contains the optional ETA for a job. * The value of this property is a {@link Calendar} object. * This property is read-only and can't be specified when the job is created. * @since 1.3 */ String PROPERTY_JOB_PROGRESS_ETA = "slingevent:progressETA"; /** * This property contains optional progress information about a job, * the number of steps the job consumer will perform. Each step is * assumed to consume roughly the same amount if time. * The value of this property is an integer. * This property is read-only and can't be specified when the job is created. * @since 1.3 */ String PROPERTY_JOB_PROGRESS_STEPS = "slingevent:progressSteps"; /** * This property contains optional progress information about a job, * the number of completed steps. * The value of this property is an integer. * This property is read-only and can't be specified when the job is created. * @since 1.3 */ String PROPERTY_JOB_PROGRESS_STEP = "slingevent:progressStep"; /** * This property contains the optional result message of a job consumer. * The value of this property is a string. * This property is read-only and can't be specified when the job is created. * @since 1.3 */ String PROPERTY_RESULT_MESSAGE = "slingevent:resultMessage"; /** * This property contains the finished date once a job is marked as finished. * The value of this property is a {@link Calendar} object. * This property is read-only and can't be specified when the job is created. * @since 1.3 */ String PROPERTY_FINISHED_DATE = "slingevent:finishedDate"; /** * This is an optional property containing a human readable title for * the job * @since 1.3 */ String PROPERTY_JOB_TITLE = "slingevent:jobTitle"; /** * This is an optional property containing a human readable description for * the job * @since 1.3 */ String PROPERTY_JOB_DESCRIPTION = "slingevent:jobDescription"; /** * The current job state. * @since 1.3 */ enum JobState { QUEUED, // waiting in queue after adding or for restart after failing ACTIVE, // job is currently in processing SUCCEEDED, // processing finished successfully STOPPED, // processing was stopped by a user GIVEN_UP, // number of retries reached ERROR, // processing signaled CANCELLED or throw an exception DROPPED // dropped jobs }; /** * The job topic. * @return The job topic */ String getTopic(); /** * Unique job ID. * @return The unique job ID. */ String getId(); /** * Get the value of a property. * @param name The property name * @return The value of the property or <code>null</code> */ Object getProperty(String name); /** * Get all property names. * @return A set of property names. */ Set<String> getPropertyNames(); /** * Get a named property and convert it into the given type. * This method does not support conversion into a primitive type or an * array of a primitive type. It should return <code>null</code> in this * case. * * @param name The name of the property * @param type The class of the type * @param <T> The class of the type * @return Return named value converted to type T or <code>null</code> if * non existing or can't be converted. */ <T> T getProperty(String name, Class<T> type); /** * Get a named property and convert it into the given type. * This method does not support conversion into a primitive type or an * array of a primitive type. It should return the default value in this * case. * * @param name The name of the property * @param defaultValue The default value to use if the named property does * not exist or cannot be converted to the requested type. The * default value is also used to define the type to convert the * value to. If this is <code>null</code> any existing property is * not converted. * @param <T> The class of the type * @return Return named value converted to type T or the default value if * non existing or can't be converted. */ <T> T getProperty(String name, T defaultValue); /** * On first execution the value of this property is zero. * This property is managed by the job handling. * @return The retry count. */ int getRetryCount(); /** * The property to track the retry maximum retry count for jobs. * This property is managed by the job handling. * @return The number of retries. */ int getNumberOfRetries(); /** * The name of the job queue processing this job. * This property is set by the job handling when the job is processed. * @return The queue name or <code>null</code> */ String getQueueName(); /** * This property is set by the job handling and contains the Sling instance ID * of the instance where this job should be processed. * @return The sling ID or <code>null</code> */ String getTargetInstance(); /** * This property is set by the job handling and contains a calendar object * specifying the date and time when this job has been started. * This property is only set if the job is currently in processing * @return The time the processing started or {@code null}. */ Calendar getProcessingStarted(); /** * This property is set by the job handling and contains a calendar object * specifying the date and time when this job has been created. * @return The time the job was created. */ Calendar getCreated(); /** * This property is set by the job handling and contains the Sling instance ID * of the instance where this job has been created. * @return The instance id the job was created on */ String getCreatedInstance(); /** * Get the job state * @return The job state. * @since 1.3 */ JobState getJobState(); /** * If the job is cancelled or succeeded, this method will return the finish date. * @return The finish date or <code>null</code> * @since 1.3 */ Calendar getFinishedDate(); /** * This method returns the message from the last job processing, regardless * whether the processing failed, succeeded or was cancelled. The message * is optional and can be set by a job consumer. * @return The result message or <code>null</code> * @since 1.3 */ String getResultMessage(); /** * This method returns the optional progress log from the last job * processing. The log is optional and can be set by a job consumer. * @return The log or <code>null</code> * @since 1.3 */ String[] getProgressLog(); /** * If the job is in processing, return the optional progress step * count if available. The progress information is optional and * can be set by a job consumer. * @return The progress step count or <code>-1</code>. * @since 1.3 */ int getProgressStepCount(); /** * If the job is in processing, return the optional information * about the finished steps. This progress information is optional * and can be set by a job consumer. * In combination with {@link #getProgressStepCount()} this can * be used to calculate a progress bar. * @return The number of the finished progress step or <code>0</code> * @since 1.3 */ int getFinishedProgressStep(); /** * If the job is in processing, return the optional ETA for this job. * The progress information is optional and can be set by a job consumer. * @since 1.3 * @return The estimated ETA or <code>null</code> */ Calendar getProgressETA(); }