blob: fb0a05221131127b4b59577e108f43386f4afacd [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.hadoop.service.launcher;
import java.util.List;
import org.apache.hadoop.classification.InterfaceAudience;
import org.apache.hadoop.classification.InterfaceStability;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.service.Service;
/**
* An interface which services can implement to have their
* execution managed by the ServiceLauncher.
* <p>
* The command line options will be passed down before the
* {@link Service#init(Configuration)} operation is invoked via an
* invocation of {@link LaunchableService#bindArgs(Configuration, List)}
* After the service has been successfully started via {@link Service#start()}
* the {@link LaunchableService#execute()} method is called to execute the
* service. When this method returns, the service launcher will exit, using
* the return code from the method as its exit option.
*/
@InterfaceAudience.Public
@InterfaceStability.Evolving
public interface LaunchableService extends Service {
/**
* Propagate the command line arguments.
* <p>
* This method is called before {@link #init(Configuration)};
* Any non-null configuration that is returned from this operation
* becomes the one that is passed on to that {@link #init(Configuration)}
* operation.
* <p>
* This permits implementations to change the configuration before
* the init operation. As the ServiceLauncher only creates
* an instance of the base {@link Configuration} class, it is
* recommended to instantiate any subclass (such as YarnConfiguration)
* that injects new resources.
* <p>
* @param config the initial configuration build up by the
* service launcher.
* @param args list of arguments passed to the command line
* after any launcher-specific commands have been stripped.
* @return the configuration to init the service with.
* Recommended: pass down the config parameter with any changes
* @throws Exception any problem
*/
Configuration bindArgs(Configuration config, List<String> args)
throws Exception;
/**
* Run a service. This method is called after {@link Service#start()}.
* <p>
* The return value becomes the exit code of the launched process.
* <p>
* If an exception is raised, the policy is:
* <ol>
* <li>Any subset of {@link org.apache.hadoop.util.ExitUtil.ExitException}:
* the exception is passed up unmodified.
* </li>
* <li>Any exception which implements
* {@link org.apache.hadoop.util.ExitCodeProvider}:
* A new {@link ServiceLaunchException} is created with the exit code
* and message of the thrown exception; the thrown exception becomes the
* cause.</li>
* <li>Any other exception: a new {@link ServiceLaunchException} is created
* with the exit code {@link LauncherExitCodes#EXIT_EXCEPTION_THROWN} and
* the message of the original exception (which becomes the cause).</li>
* </ol>
* @return the exit code
* @throws org.apache.hadoop.util.ExitUtil.ExitException an exception passed
* up as the exit code and error text.
* @throws Exception any exception to report. If it provides an exit code
* this is used in a wrapping exception.
*/
int execute() throws Exception;
}